Problem - C2 - Codeforces

简单版本和困难版本之间的唯一区别是约束。
如果你用Python写一个解决方案,那么最好用PyPy发送,以加快执行时间。
贝兰德州立大学的一场会议已经开始。许多学生正在参加考试。
波利格拉夫维奇要对N个学生进行考试。学生们将按照从第1个到第n个的顺序逐一参加考试。考试的规则如下:
第i个学生随机选择一张票。
 如果这张票对学生来说太难,他就不回答,并立即回家(这个过程非常快,以至于被认为没有时间流逝)。这个学生没有通过考试。
 如果这个学生认为这张票很容易,他花了整整十分钟来通过考试。之后,他立即得到一个分数并回家。
 学生按照固定的顺序,一个接一个地参加考试,没有任何干扰。在任何时候,Polygraph Poligrafovich都会从一个学生那里获得答案。
所有学生的整个考试时间是M分钟(maxti≤M),所以排在最后的学生有更大的可能用尽时间通过考试。
对于每个学生i,你应该计算出需要失败的学生的最小可能数量,以便第i个学生有足够的时间通过考试。
对于每个学生i,独立地找到答案。也就是说,如果在为学生i1寻找答案时,一些学生j应该离开,那么在为i2寻找答案时(i2>i1),学生j不必回家。
输入
输入的第一行包含两个整数n和M(1≤n≤2⋅105,1≤M≤2⋅107)--分别是学生人数和考试的总时间(分钟)。
输入的第二行包含n个整数ti (1≤ti≤100 )--第i个学生回答一张票所花的时间,以分钟计。
保证ti的所有值都不大于M。
Examples
input
Copy
7 15 1 2 3 4 5 6 7
output
Copy
0 0 0 0 0 2 3
input
Copy
5 100 80 40 40 40 60
output
Copy
0 1 1 2 3
输出
打印n个数字:第i个数字必须等于为了使第i个学生有足够的时间通过考试而必须离开考试的最小人数。
 题解:
 本来是直接用优先队列写的,好像确实会t,(用队列即使是t了,也可能会报WA)
正确思路是统计目前ti每种有多少,由于t<=100
每个ti,直接从1~100小到大看最多能放几个,(贪心来讲)肯定是小的放的越多越好,
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII; 
const int N = 1e6 + 10;
int a[104];
void solve()
{
	int n,m;
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
	{
		int x;
		cin >> x;
		int cnt = m - x;
		int ans = 0;
		for(int j = 1;j <= 100;j++)
		{
			int p = min(cnt/j , a[j]);
			cnt -= p*j;
			ans += p;
		}
		cout <<i - 1 - ans <<" ";
		a[x]++;
	}
}
signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

![[pgrx开发postgresql数据库扩展]2.安装与开发环境的搭建](https://img-blog.csdnimg.cn/img_convert/5532f1f571da5d6ccc54a556a30a4d5f.webp?x-oss-process=image/format,png)
















