题目:天梯赛的赛场安排
- 这个题目在分考场时,每个学校要想联系监考人最少都应该尽可能的在一个考场,所以我们可以直接得出每个学校联系的监考员数量(x+c-1)/c, 每个学校如果不能完全分满n个考场,就把多余的x%c存到优先队列中,考场数量加上x/c。
- 接下来需要对这多余的人数判断处理还需要多少个考场,对于有限队列中的每一个元素,如果当前考场中有考场能够放下这些人,就不用新开考场,否则需要一个新考场。
typedef unsigned long long ull;
typedef long long ll;
using namespace std;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
/**
* 不要使用#define int long long
* 不开long long见祖宗
* ----YuFei Zhou
*/
void solve() {
int n,c;
cin>>n>>c;
int res = 0;
priority_queue<int> q;
for (int i = 1; i <= n; ++i) {
string s;
int x;
cin>>s>>x;
cout<<s<<" "<<(x+c-1)/c<<endl; //直接输出每个学校需要联系的最少监考员人数
res += x/c; //先计算一下每个学校能装满几个考场,装不满一个考场的就为0
if(x % c) q.push(x%c); //每个学校装满考场后剩下的一部分人
}
vector<int> ans;
while (!q.empty()){
int tmp = q.top();
q.pop();
bool flag = false;
for (int i = 0; i < ans.size(); ++i) {
if(tmp <= c - ans[i]){ //现有的考场能装下就安排在这个考场,无需新开考场
flag = true;
ans[i] += tmp;
break;
}
}
if(!flag){ //如果现有的考场不能装下就新开一个考场
ans.push_back(tmp);
res++;
}
}
cout<<res<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
int t = 1;
//cin>>t;
while(t--){
solve();//1 2 3 4 5
}
return 0 ;
}