本文共 1341 字,大约阅读时间需要 4 分钟。
自己猜测了一下 按比赛次数 从大到小排 然后类似于模拟 先排胜的场次 当只剩一场 将它定义为败
#include #include #include #include #include #include #include #include #include #include #include #include #define maxn 100010#define INF 0x7fffffff#define inf 10000000#define MOD 1000000007#define ull unsigned long long#define ll long longusing namespace std;struct node{ int id, x; bool operator < (const node& p) const { return x > p.x; }};node pp[110];int win[maxn], lose[maxn];void solve(int sum){ int j = 0; for(int i =0 ; i < sum; ++ i) { while(!pp[j].x) j++; if(pp[j].x > 1) { win[i] = pp[j].id; pp[j].x--; } else if(pp[j].x == 1) { lose[i] = pp[j].id; pp[j].x--; j++; win[i] = pp[j].id; pp[j].x--; } } j = 0; for(int i =0 ; i < sum; ++ i) { if(lose[i]) continue; while(!pp[j].x) j++; if(pp[j].x > 1) { lose[i] = pp[j].id; pp[j].x--; } else if(pp[j].x == 1) { lose[i] = pp[j].id; pp[j].x--; j++; } }}int main(){ int n; while(scanf("%d", &n) == 1) { int sum = 0; for(int i = 0; i < n; ++ i) { scanf("%d", &pp[i].x); pp[i].id = i+1; sum += pp[i].x; } sort(pp, pp+n); memset(win, 0, sizeof(win)); memset(lose, 0, sizeof(lose)); sum /= 2; solve(sum); printf("%d\n", sum); for(int i = 0; i < sum; ++ i) printf("%d %d\n", win[i], lose[i]); } return 0;}
转载于:https://www.cnblogs.com/avema/p/3774187.html