为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。
Sgu/138
来自NOCOW
< Sgu
/* 构造。构造的关键是:1.每场的胜者将在下一场出现 2.不会自己对战自己 按如下方法构造: 按场次从大到小填掉win,若只剩一场就填到lose去。 win a a a b b c c ... lose a b 最后把剩下的填到lose没填的地方即可。 */ #include <stdio.h> #include <algorithm> using namespace std; int n, sum, cnt[101], pos[101]; int win[10001], lose[10001]; bool cmp(const int& a, const int& b) { return (cnt[a] > cnt[b]); } int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &cnt[i]); sum += cnt[i]; pos[i] = i; } sum /= 2; sort(pos+1, pos+n+1, cmp); int j = 1; for (int i = 1; i <= sum; ++i) { if (cnt[pos[j]] == 1) { lose[i] = pos[j]; cnt[pos[j++]]--; } win[i] = pos[j]; cnt[pos[j]]--; } for (int i = 1; i <= sum; ++i) { if (lose[i]) continue; if (!cnt[pos[j]]) j++; lose[i] = pos[j]; cnt[pos[j]]--; } printf("%d\n", sum); for (int i = 1; i <= sum; ++i) printf("%d %d\n", win[i], lose[i]); return 0; } // From FingerSed