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;
}

猜你喜欢

转载自www.cnblogs.com/2462478392Lee/p/11295952.html
今日推荐