为防止广告,目前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
个人工具