2019牛客多校第六场D -Move

题意:

   给出 k个箱子,n个物品的体积,问装箱子最小多大

题解:

   暴力,每个箱子的最小从 sum / k 开始,最大为sum(sum为物品的体积和)

#include 
using namespace std;
const int maxn = 1000 + 7;
int a[maxn], n, k, used[maxn];
bool judge(int x){
	memset(used, 0, sizeof(used));  // 表示没用过
	for(int i = 1; i <= k; i++){    // k个箱子
		int tmp = 0;
          for(int j = n; j >= 1; j--){
             if(!used[j] && tmp + a[j] <= x){  // 容量为x时,能否装下
                used[j] = 1;
                tmp += a[j];
             }
          }
	}
	for(int i = 1; i <= n; i++){
		if(!used[i]){       // 如果有没用过的
			return false;
		}
	}
	return true;
}
int main(){
	int t;
	cin >> t;
	for(int i = 1; i <= t; i++){
		int sum = 0, ans = 0;
		cin >> n >> k;
		for(int j = 1; j <= n; j++){
			cin >> a[j];
			sum += a[j];
		}
		sort(a+1, a+1+n);
		for(int j = sum / k; j <= sum; j++){
			if(judge(j)){       // 判断 j 是否符合
				ans = j;
				break;
			}
		}
		cout << "Case #" << i << ": " << ans << endl;
	}
}

 

你可能感兴趣的:(模拟)