Codeforces Contest 730 A Toda 2 —— 贪心

    xiaoxiao2023-11-07  160

    This way

    题意:

    已知n个人的rating值,现在每个人每次参加一次比赛rating值会-1,让你组织一些比赛使得所有人的rating值相同并且最大,注意每场比赛能够参加的人数>=2&&<=5.并且比赛场数<=10000.

    题解:

    假设每次都让两个人参加比赛,那么只有最多只有5000场比赛。 那么我们每次都组织两个人参加比赛,但是有留下最后一个人的情况:2 2 3,那么在做的时候要注意是否剩下3个人需要减少。

    #include<bits/stdc++.h> using namespace std; #define pa pair<int,int> vector<pa>ans; priority_queue<pa>Q; struct node{int x,y,z;}; vector<node>three; int main() { int n,mi=105,x; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&x),mi=min(mi,x),Q.push({x,i}); while(1) { pa fir=Q.top();Q.pop(); pa sec=Q.top();Q.pop(); pa thr=(pa){0,0},fou=(pa){0,0}; if(!Q.empty()) thr=Q.top(),Q.pop(); if(!Q.empty()) fou=Q.top(),Q.pop(); if(thr.second) { if(fir.first>thr.first) { ans.push_back({fir.second,sec.second}); Q.push({max(0,fir.first-1),fir.second}); Q.push({max(0,sec.first-1),sec.second}); mi=min(mi,max(0,sec.first-1)); } else { if(thr.first==mi) break; if(thr.first==fou.first) { ans.push_back({fir.second,sec.second}); Q.push({max(0,fir.first-1),fir.second}); Q.push({max(0,sec.first-1),sec.second}); mi=min(mi,max(0,sec.first-1)); } else if(fou.first==mi) { node a=(node){fir.second,sec.second,thr.second}; three.push_back(a); Q.push({max(0,fir.first-1),fir.second}); Q.push({max(0,sec.first-1),sec.second}); Q.push({max(0,thr.first-1),thr.second}),thr.second=0; mi=min(mi,max(0,thr.first-1)); } else { ans.push_back({fir.second,sec.second}); Q.push({max(0,fir.first-1),fir.second}); Q.push({max(0,sec.first-1),sec.second}); mi=min(mi,max(0,sec.first-1)); } } } else { if(fir.first==sec.first) break; else { ans.push_back({fir.second,sec.second}); Q.push({max(0,fir.first-1),fir.second}); Q.push({max(0,sec.first-1),sec.second}); mi=min(mi,max(0,sec.first-1)); } } if(thr.second) Q.push(thr); if(fou.second) Q.push(fou); } printf("%d\n",mi); printf("%d\n",ans.size()+three.size()); for(int i=0;i<ans.size();i++) { for(int j=1;j<=n;j++) if(j==ans[i].first||j==ans[i].second) printf("1"); else printf("0"); printf("\n"); } for(int i=0;i<three.size();i++) { for(int j=1;j<=n;j++) if(j==three[i].x||j==three[i].y||j==three[i].z) printf("1"); else printf("0"); printf("\n"); } return 0; }
    最新回复(0)