Move
题意:给你n个物品体积,你用k个相同体积的篮子去装,不能装超过篮子的体积,求篮子体积的最小值
思路:其因为数都是1000,令sum为物体总体积,maxV为物体体积最大值,所以其篮子体积下界为max((int)ceil(sum/k),maxV),而上界就是ceil(sum/k)+maxV然后暴力枚举去判断能否满足就ac了。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<queue> #define ll long long using namespace std; const int N = 1e3+5; int t,n,k,maxV,v; int a[N],b[N]; bool cmp(int a,int b){ return a > b; } bool check(int x) { for(int i=1;i<=n;i++) b[i]=x; int cnt=1; for(int i=1;i<=n;i++){ int flag=0; for(int j=1;j<=cnt;j++){ if(b[j]>=a[i]) { b[j]-=a[i]; flag=1; break; } } if(!flag) { cnt++; b[cnt]-=a[i]; } } v=0; if(cnt<=k) return true; return false; } int main() { int x=0; scanf("%d",&t); while(t--) { int sum=0; maxV=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; maxV=max(a[i],maxV); } sort(a+1,a+1+n,cmp); int ans=0; for(int i=max((int)ceil(sum/k),maxV);i<=ceil(sum/k)+maxV;i++) { if(check(i)) { ans= i; break; } } printf("Case #%d: ",++x); printf("%d\n",ans); } return 0; }