AcWing 5013. 天梯赛的赛场安排
原题链接
中等
作者:
无苦邪
,
2024-04-15 21:05:06
,
所有人可见
,
阅读 12
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int main() {
int n,c;
scanf("%d%d",&n,&c);
// 题目中按照未安排赛场的队员人数从大到小处理
// 看见从大或者从小,想到优先队列
// 默认最大堆
// priority_queue<int,int,greater<int>> q;
priority_queue<int> q;
int res=0;
for(int i=1; i<=n; i++) {
string s;
int d;
cin>>s>>d;
// 如果人数刚好被赛场容量整除 直接输出
if(d%c==0) cout<<s<<" "<<d/c<<endl;
// 不能整除则要新进一个考场,联系人 + 1
else {
cout<<s<<" "<<d/c+1<<endl;
q.push(d%c);
}
res+=d/c;
}
// 新开考场
vector<int> sc;
// 开始处理多出人数
while(!q.empty()) {
int tmp=q.top();
q.pop();
bool flag=true;
for(int i=0; i<sc.size(); i++) {
// 如果当前新考场剩余人数大于tmp
// 则塞进去
if(c-sc[i]>=tmp) {
sc[i]+=tmp;
flag=false;
break;
}
}
if(flag) {
sc.push_back(tmp);
res++;
}
}
cout<<res<<endl;
return 0;
}
原作者