题意: 多组询问,n个人,值m, 接下来n个值,要求当前值加上前面尽量多的值之和小于等于 m ,问前面要去掉几个值
模拟判断,然后把当前值插入,再while()把不合法的直接删除,因为当前这个数不合法以后就不会用了。
具体见代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
multiset<int> s;
ll sum;
void er(ll v){
s.erase(s.find(v));
sum-=v;
}
void in(ll v){
s.insert(v);
sum+=v;
}
void solve(){
sum = 0;
s.clear();
int n,m,tot=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
int x,num=0;
scanf("%d",&x);
auto it = s.end();
ll tp = sum;
while(tp+x>m){
it--;
tp-=(*it);
num++;
}
printf("%d ",num+tot);
in(x);
while(sum>m){
auto it = s.end();
it--;
er((*it));
tot++;
}
}
printf("\n");
}
int main()
{
int q;
scanf("%d",&q);
while(q--)
solve();
return 0;
}