这道题感觉很坑,上去打二分的全wa了,造成提交150多通过0的局面。
主要是箱子容积和答案没有单调性。比如这组数据:
15 5
39 39 39 39 39 60 60 60 60 60 100 100 100 100 100
可以发现199是合法答案,而200不是。主要是题里限制规则的影响,所以只能暴力判,从下界(sum/k)开始暴力判,跑的相当快。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int t, k, n, ca = 1, a[N], v[N];
int ch(int m) {
memset(v, 0, sizeof v);
int sum = 0;
for(int i = n; i >= 1; i--) {
int flag = 0;
for(int j = 0; j < sum; j++) {
if(v[j] + a[i] <= m) {
v[j] += a[i];
flag = 1;
break;
}
}
if(!flag) {
v[sum++] = a[i];
}
if(sum > k)
return 0;
}
return 1;
}
int main() {
scanf("%d", &t);
while(t--) {
int sum = 0;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]), sum += a[i];
sort(a + 1, a + n + 1);
int ans = sum / k;
while(!ch(ans))
ans++;
printf("Case #%d: %d\n", ca++, ans);
}
return 0;
}