AtCoder Beginner Contest 165 E - Rotation Matching 题解(思维)

题目链接

题目大意

有n个选手, m个比赛场地,为海m个比赛场地指定一对选手的编号 (一 个编号只能出现在一个比赛场地) ,来保证在之后的n轮比赛中,所有选手不会与同-选手比赛两次,每轮比赛后所有选手编号加1,编号n+ 1的变为1。

题目思路

一个选手最多的情况是要与m个人一人比一次,所以m对编号应取m个不同的间隔。即在[1, n]中取m对数,每对数间隔不同的长度。
emm。。。怎么说了,感觉这个结论是显然的。如何构造看代码就懂了。就类似于下图的构造方法
AtCoder Beginner Contest 165 E - Rotation Matching 题解(思维)_第1张图片
AtCoder Beginner Contest 165 E - Rotation Matching 题解(思维)_第2张图片

代码

#include
using namespace std;
int m,n;
int main(){
    scanf("%d%d",&n,&m);
    int l1=1,r1=l1+m,l2=r1+1,r2=l2+m-1;
    while(true){
        if(l1>=r1) break;
        printf("%d %d\n",l1,r1);
        if(l2>=r2) break;
        printf("%d %d\n",l2,r2);
        l1++,l2++;
        r1--,r2--;
    }
    return 0;
}

你可能感兴趣的:(思维)