E - Rotation Matching(思维)

题目传送门

思路:由于最多只有轮,根据题意可知,每进行一轮就相当整个序列向左移动一格,如果是第一格就移动到最后一格。

要使轮每个人都不会打重复的对手,显然每一个场地两个人的数字差肯定要不一样。

因此我们构造m对数字差分别为的数字对即可。这样轮过后才会重复。

所以我们可以将分为两部分,第一部分:+1, 然后配对

差值分别为

第二部分同理:,然后配对

差值分别为

综上此题就得到解决。

AC代码:(写法1)

#include<cstdio>
using namespace std;
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1,j=m+1;i<j;i++,j--)
        printf("%d %d\n",i,j);
    for(int i=m+2,j=2*m+1;i<j;i++,j--)
        printf("%d %d\n",i,j);
    return 0;
}

AC代码:(写法2)

#include<cstdio>
using namespace std;
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=(m+1)/2;i++)
        printf("%d %d\n",i,m+2-i);
    for(int i=1;i<=(m/2);i++)
        printf("%d %d\n",m+1+i,2*m+2-i);
    return 0;
}