题目:天梯赛的赛场安排

  1. 这个题目在分考场时,每个学校要想联系监考人最少都应该尽可能的在一个考场,所以我们可以直接得出每个学校联系的监考员数量(x+c-1)/c, 每个学校如果不能完全分满n个考场,就把多余的x%c存到优先队列中,考场数量加上x/c。
  2. 接下来需要对这多余的人数判断处理还需要多少个考场,对于有限队列中的每一个元素,如果当前考场中有考场能够放下这些人,就不用新开考场,否则需要一个新考场。
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 ;
}