题意:给出整数n(1 <= n <= 2 * 10^5)和m(1 <= m <= 2 * 10^7),给出n个整数的序列t(1<=ti<=100)。询问每个ti,最少删除1~i-1范围内的几个数可以使前i个数的和小于m。
题解:num[j]统计第1~i-1个数内出现了几次j。然后通过贪心的思想从100到1进行枚举,可以得到答案。
题目链接:http://codeforces.com/contest/1185/problem/C2
#include<bits/stdc++.h>
#define N 200005
using namespace std ;
int n , m ;
int t[N] ;
int sum[N] , temp ;
int num[N] ;
int main()
{
int i , j ;
int cnt ;
scanf("%d%d" , &n , &m) ;
sum[0] = 0 ;
for(i = 1 ; i <= n ; i ++)
{
scanf("%d" , &t[i]) ;
sum[i] = sum[i - 1] + t[i] ;
}
for(i = 1 ; i <= 100 ; i ++)
num[i] = 0 ;
for(i = 1 ; i <= n ; i ++)
{
if(sum[i] <= m)
{
printf("0 ") ;
num[t[i]] ++ ;
continue ;
}
temp = sum[i] ;
cnt = 0 ;
for(j = 100 ; j >= 1 ; j --)
{
if(temp - num[j] * j <= m)
{
cnt += ((temp - m) / j) ;
if((temp - m) % j != 0)
cnt ++ ;
break ;
}
else
{
temp -= num[j] * j ;
cnt += num[j] ;
}
}
num[t[i]] ++ ;
printf("%d " , cnt) ;
}
}