一开始的感觉用multiset维护一个堆来做,发现思路乱七八糟。
看了别人的题解,1分钟的事情,思维还是很重要啊。
经验:当强调序列是有序的,要考虑是不是边输入边维护。
思路:每次输入时间时,计算在减去当前时间的剩下时间,最多可以让几个人考试,然后贪心从时间小的开始,并维护每个前序中每个时间出现的次数。
int a[105];
int main()//有序的问题很可能是边输入,边维护
{
int n, m;
while (cin >> n >> m)
{
f(i, 1, n)
{
scanf("%d", &t);
int remain = m - t;//剩下可以让他之前的人考试的时间
int ans = 0;
f(j, 1, 100)//贪心 从时间少的开始选
{
int x = min(remain / j, a[j]);//总时间和每个时间的次数限制下的最多可考数
ans += x;
remain -= j * x;
}
a[t]++;
printf("%d ", i-1 - ans);
}
}
return 0;
}