D 题意感觉说的不是很清楚,一开始题意弄错了,以为是最优的方案,结果是对于每个盒子这个"so clever"的人的做法是优先选择尽可能大的物品装完一个盒子,我就不知道这个人哪里聪明了。。
思路:赛后知道题意后,5分钟写完,瞎暴力就一发过了,我自己都有点出乎意料真水了。
#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
",it,i);
break;
}
}
}
}
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(" "); // } 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?? ",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 ",j,s); ans=max(ans,s); } printf("Case #%d: %lld ",it,ans); } }