D 题意感觉说的不是很清楚,一开始题意弄错了,以为是最优的方案,结果是对于每个盒子这个"so clever"的人的做法是优先选择尽可能大的物品装完一个盒子,我就不知道这个人哪里聪明了。。
思路:赛后知道题意后,5分钟写完,瞎jb暴力就一发过了,我自己都有点出乎意料真水了。
#include<bits/stdc++.h> using namespace std; const int maxn=1e3+10; int v[maxn]; int vis[maxn]; int temp[maxn]; int n,m; int cmp(int a,int b) { return a>b; } int check(int x) { memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) temp[i]=v[i]; sort(temp+1,temp+1+n,cmp); if(temp[1]>x) return 0; int cnt=0; for(int i=1; i<=n; i++) { if(vis[i]==0) { int cha=x-temp[i]; cnt++; vis[i]=1; for(int j=i+1; j<=n; j++) { if(temp[j]<=cha&&vis[j]==0) { cha-=temp[j]; vis[j]=1; } } } } if(cnt<=m) return 1; else return 0; } int main() { int t; scanf("%d",&t); for(int it=1; it<=t; it++) { scanf("%d%d",&n,&m); int sum=0; for(int i=1; i<=n; i++) { scanf("%d",&v[i]); sum+=v[i]; } int l=sum/m; for(int i=l;; i++) { if(check(i)) { printf("Case #%d: %d\n",it,i); break; } } } }View Code
J 这个题也水的一比,我队友还说用DP,可是思考一下明显不需要嘛,不过一开始一个变量赋值出错,还有下标没有从0开始忽略了等级为0的情况,疯狂罚时,有点不爽。
#include<bits/stdc++.h> using namespace std; const int maxn=1e3+10; #define ll long long ll sum[maxn][maxn]; ll per[maxn][maxn]; int val[maxn][maxn]; ll d[maxn]; int pos[maxn][maxn]; int main() { int t; scanf("%d",&t); for(int it=1; it<=t; it++) { int n,m; scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { int t; scanf("%d",&t); val[i][j]=t; } for(int i=1; i<=m; i++) { scanf("%lld",&d[i]); d[i]+=d[i-1]; } for(int j=1; j<=m; j++) for(int i=1; i<=n; i++) { per[i][j]=per[i][j-1]+val[i][j]; } for(int i=1; i<=n; i++) { ll minn=per[i][m]; int p=m; for(int j=m; j>=0; j--) { if(minn>=per[i][j]) { minn=per[i][j]; p=j; } sum[i][j]=minn; pos[i][j]=p; } } // for(int i=1;i<=n;i++) // { // for(int j=1;j<=m;j++) // printf("%d ",sum[i][j]); // printf("\n"); // } ll ans=0; for(int j=0; j<=m; j++) { ll s=0; int pmin=0x3f3f3f3f; for(int i=1; i<=n; i++) { s+=sum[i][j]; pmin=min(pmin,pos[i][j]); } // printf("%d %d??\n",pmin,s); if(pmin!=j) { ll t=1e18; for(int i=1; i<=n; i++) t=min(t,-sum[i][j]+per[i][j]); s+=t; } // printf("%d %d") s=d[j]-s; // printf("%d %d\n",j,s); ans=max(ans,s); } printf("Case #%d: %lld\n",it,ans); } }View Code