题意:
已知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;
}