E - Rotation Matching(思維)

E - Rotation Matching(思維)

題目傳送門

思路:由於最多隻有(M+1)2\dfrac{(M+1)}{2}輪,根據題意可知,每進行一輪就相當整個序列向左移動一格,如果是第一格就移動到最後一格。

ep:ep:

round1:1,2,3,4,5round\quad 1:1,2,3,4,5

round2:2,3,4,5,1round\quad 2:2,3,4,5,1

round3:3,4,5,1,2round\quad 3:3,4,5,1,2

要使mm輪每個人都不會打重複的對手,顯然每一個場地兩個人的數字差肯定要不一樣。

因此我們構造m對數字差分別爲1,2,3m1,2,3\dots m的數字對即可。這樣nn輪過後纔會重複。

所以我們可以將1,2,3,4n1,2,3,4\dots n分爲兩部分,第一部分:1,2m1,2\dots m+1, 然後配對

pair(1,m+1),pair(2,m),pair(3,m1)pair(1,m+1),pair(2,m),pair(3,m-1)\dots\dots 差值分別爲m,m2,m4m,m-2,m-4\dots\dots

第二部分同理:m+2,m+32m+1m+2,m+3\dots2m+1,然後配對

pair(m+2,2m+1),pair(m+3,2m),pair(m+4,2m1)pair(m+2,2m+1),pair(m+3,2m),pair(m+4,2m-1)\dots\dots 差值分別爲m1,m3,m5m-1,m-3,m-5\dots\dots

綜上此題就得到解決。

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章