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();
}
}