@[SuperOreo](/space/show?uid=86444) 快读+register试试?
by 引领天下 @ 2018-10-31 22:13:52
@[引领天下](/space/show?uid=39863)
谢谢关心,不过好像没卡这
```cpp
#pragma GCC optimize(3)
#include<cstdio>
#include<algorithm>
using namespace std;
inline void read(int &a){
a = 0;static char t = getchar();
while(t>'9' || t<'0')t=getchar();
while(t>='0' && t<='9'){
a = (a << 3) + (a << 1) + (t^ 48);
t=getchar();
}
}
int ans,m,n,Sum,Waste;
int Cake[51],ClaM[1025],ClSum[1025];
bool search(int whi,int from){
if(!whi) return true;
if(Sum - Waste < ClSum[ans]) return false;
int nextF;
if(ClaM[whi - 1] == ClaM[whi])
nextF = from;
else
nextF = 1;
for(register int i=from; i<=n; i++){
if(Cake[i] >= ClaM[whi]){
Cake[i] -= ClaM[whi];
if(Cake[i] < ClaM[1])
Waste += Cake[i];
if(search(whi - 1, nextF)){
if(Cake[i] < ClaM[1])
Waste -= Cake[i];
Cake[i] += ClaM[whi];
return true;
}
if(Cake[i] < ClaM[1])
Waste -= Cake[i];
Cake[i] += ClaM[whi];
}
}
return false;
}
int main(){
read(n);
// scanf("%d", &n);
register int i;
for(i=1; i<=n; i++){
read(Cake[i]);
// scanf("%d", &Cake[i]);
Sum += Cake[i];
}
// scanf("%d", &m);
read(m);
for(i=1; i<=m; i++){
// scanf("%d", &ClaM[i]);
read(ClaM[i]);
ClSum[i] = ClSum[i-1] + ClaM[i];
}
sort(ClaM + 1, ClaM + 1 + m);
sort(Cake + 1, Cake + 1 + n);
for(i=1; i<=m; i++)
ClSum[i] = ClSum[i-1] + ClaM[i];
while(ClaM[m] > Cake[n]) m--;
for(ans = 1; ans<=m; ans++){
if(!search(ans, 1)){
break;
}
}
printf("%d", ans-1);
// ans = m;
// if(search(m, 1)){
// printf("%d", m);
// return 0;
// }
// int l = 0,r = m;
// while(l+1 != r){
// ans = (l+r)>>1;
// if(!search(ans, 1)){
// r = ans;
// }else{
// l = ans;
// }
// }
// printf("%d", l);
return 0;
}
```
by SuperOreo @ 2018-10-31 22:18:53
@[SuperOreo](/space/show?uid=86444) 再加上快输,变量别重复开
by 引领天下 @ 2018-11-01 20:05:56
.
by int64 @ 2021-11-14 09:23:27