其 实 开 始 想 了 很 久 其实开始想了很久 其实开始想了很久
突 然 看 到 每 个 人 的 时 间 最 大 才 100 ! ! ! 突然看到每个人的时间最大才100!!! 突然看到每个人的时间最大才100!!!
这 里 强 调 一 点 , 时 间 本 可 以 是 1 e 5 甚 至 更 大 这里强调一点,时间本可以是1e5甚至更大 这里强调一点,时间本可以是1e5甚至更大
但 是 才 100 , 说 明 这 是 个 突 破 口 ! ! 我 们 直 接 开 数 组 把 每 种 时 间 存 有 多 少 个 但是才100,说明这是个突破口!!我们直接开数组把每种时间存有多少个 但是才100,说明这是个突破口!!我们直接开数组把每种时间存有多少个
然 后 新 加 入 一 个 人 , 就 可 以 遍 历 数 组 从 100 到 1 , 计 算 要 多 少 人 失 败 节 省 时 间 然后新加入一个人,就可以遍历数组从100到1,计算要多少人失败节省时间 然后新加入一个人,就可以遍历数组从100到1,计算要多少人失败节省时间
#include <bits/stdc++.h>
using namespace std;
int n,m,a[200009],vis[101];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int temp=0;
for(int i=1;i<=n;i++)
{
temp+=a[i];
if(temp<=m) printf("0 ");
else
{
int num=0,now=temp-m;//需要腾出这么多
for(int i=100;i>=1;i--)
{
if(vis[i]==0) continue;
if(vis[i]*i<now) num+=vis[i],now-=vis[i]*i;
else
{
num+=now/i+1;
if(now%i==0) num--;
break;
}
}
printf("%d ",num);
}
vis[a[i]]++;
}
}