按照w/t从大到小排序,先全放上面,再一本一本地放到下面,直到上面的宽度小于等于下面的厚度。最后判断<最后一本放到下面的厚度为1的书>是否可以拿上来,保证贪心的正确性(比如样例1)
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n;
struct A{
int t, w;
}a[N];
int tw, tt;
int l;
bool cmp(A x, A y){
return 1.0 * x.w / x.t > 1.0 * y.w / y.t;
}
int main(){
scanf("%d", &n);
for (int i = 1; i <= n; i ++){
scanf("%d%d", &a[i].t, &a[i].w);
tw += a[i].w;
}
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i ++){
tw -= a[i].w;
tt += a[i].t;
if (a[i].t == 1){
l = i;
}
if (tw <= tt){
break;
}
}
if (l != 0 && tw + a[l].w <= tt - a[l].t){
printf("%d", tt - a[l].t);
return 0;
}
printf("%d", tt);
return 0;
}
然而 Wrong answer on test 20 qwq