AtCoder Beginner Contest 165 E Rotation Matching 構造不同場次的間距均不相等

AtCoder Beginner Contest 165   比賽人數11730  比賽開始後15分鐘看到所有題

AtCoder Beginner Contest 165  E  Rotation Matching   構造不同場次的間距均不相等

總目錄詳見https://blog.csdn.net/mrcrack/article/details/104454762

在線測評地址https://atcoder.jp/contests/abc165/tasks/abc165_e

討論間距的原因:

在N輪比賽中,不同場次,不同競技場中,會遇到雷同字母,若有間距相等的情況,另一個字母大概率相同,造成了衝突。

故要設置不同間距。如有不明,讀者繼續往下看。

1.舉個會衝突的例子

5 2

構造比賽如下,請注意會有衝突發生。
1 3
2 5

第1輪
當前選手A B C D E
選手數值1 2 3 4 5
數字表示0 1 2 3 4
競技場上選手AC(02)間距2-0=2;BE(14)間距4-1=3

第2輪
當前選手A B C D E
選手數值2 3 4 5 1
數字表示0 1 2 3 4
競技場上選手EB(41)間距1-4+5=2也可認爲間距是4-1=3,此時與第一輪 BE(14)間距4-1=3 衝突;
AD(03)間距3-0=3

讀者可以看到
1 3 間距可以是3-1=2,也可以是1-3+5=3
2 5 間距可以是5-2=3,也可以是2-5+5=2

可以看到1 3的間距與2 5的間距有相同的情況,故在5輪比賽中,一定會衝突。

2.需要構造的不同場次的間距均不相等,那麼如何構造呢,請接着看。

2.1.1請看n=11,m=5的極端情況,請注意,m是奇數

這樣構造
2 4 間距4-2=2,間距也可以是2-4+11=9
1 5 間距5-1=4,間距也可以是1-5+11=7
8 9 間距4-3=1,間距也可以是3-4+11=10
7 10 間距10-7=3,間距也可以是7-10+11=8
6 11 間距11-6=5,間距也可以是6-11+11=6

請看上面的間距,沒有一處是相等的,所有不會出現衝突的情況,讀者若不信,可以手工進行模擬。

2.1.2若n=11,m=3的情況

這樣構造
2 4 間距4-2=2,間距也可以是2-4+11=9
1 5 間距5-1=4,間距也可以是1-5+11=7
8 9 間距4-3=1,間距也可以是3-4+11=10


請看上面的間距,沒有一處是相等的,所有不會出現衝突的情況,讀者若不信,可以手工進行模擬。

2.1.3請看n=12,m=5的極端情況,需刪去1個點,變成下圖

這樣構造
2 4 間距4-2=2,間距也可以是2-4+12=10   注意計算第2個間距時是+12不是+11
1 5 間距5-1=4,間距也可以是1-5+12=8
8 9 間距4-3=1,間距也可以是3-4+12=11
7 10 間距10-7=3,間距也可以是7-10+12=9
6 11 間距11-6=5,間距也可以是6-11+12=7

請看上面的間距,沒有一處是相等的,所有不會出現衝突的情況,讀者若不信,可以手工進行模擬。

2.2請看n=13,m=6的極端情況,請注意,m是偶數

這樣構造
3 5 間距5-3=2,間距也可以是3-5+13=11
2 6 間距6-2=4,間距也可以是2-6+13=9
1 7 間距7-1=6,間距也可以是1-7+13=7
10 11 間距11-10=1,間距也可以是10-11+13=12
9 12 間距12-9=3,間距也可以是9-12+13=10
8 13 間距13-8=5,間距也可以是8-13+13=8

請看上面的間距,沒有一處是相等的,所有不會出現衝突的情況,讀者若不信,可以手工進行模擬。

3.1知道原理後,怎麼編碼,就看個人了,提供筆者的AC參考代碼如下

#include <stdio.h>
int main(){
	int n,m,i,t,l,r;
	scanf("%d%d",&n,&m);
	if(n%2==0)n--;//n是偶數
	t=(n-1)/2;//t表示n對應的最大m值
	if(t==1)return 0*printf("1 2\n");//特判
	l=t/2,r=l+2;//先打印r-l爲偶數的區間
	for(i=1;i<=m;i++){
		printf("%d %d\n",l,r);
		l--,r++;
		if(l==0)l=(t+n+1)/2,r=l+1;//區間跳躍,跳躍到r-l爲奇數的區間
	}
	return 0;
}

3.2若覺得筆者上述代碼太精煉,可以看下面這個冗餘的AC代碼。

#include <stdio.h>
int main(){
	int n,m,i,t,l,r;
	scanf("%d%d",&n,&m);
	if(n%2==0)n--;
	t=(n-1)/2;
	if(t==1)return 0*printf("1 2\n");//特判
	if(t&1){//t是奇數
		l=t/2,r=l+2;
		for(i=1;i<=m;i++){
			printf("%d %d\n",l,r);
			l--,r++;
			if(l==0)l=(t+n)/2,r=l+1;
		}
	}else{//t是偶數
		l=t/2,r=l+2;
		for(i=1;i<=m;i++){
			printf("%d %d\n",l,r);
			l--,r++;
			if(l==0)l=(t+1+n)/2,r=l+1;
		}
	}
	return 0;
}

4.前面所有的內容,都是建立在對樣例理解的基礎上得出的。樣例模擬如下,有耐心的,可以看一下。

4 1

6種情況
1 2可行;1 4可行;2 3可行;
1 3衝突;2 4衝突;3 4可行
1.1 2可行
第1輪
當前選手A B C D
選手數值1 2 3 4
數字表示0 1 2 3
競技場上選手AB(01)間距1-0=1

第2輪
當前選手A B C D
選手數值2 3 4 1
數字表示0 1 2 3
競技場上選手DA(30)間距0-3+4=1

第3輪
當前選手A B C D
選手數值3 4 1 2
數字表示0 1 2 3
競技場上選手CD(23)間距3-2=1

第4輪
當前選手A B C D
選手數值4 1 2 3
數字表示0 1 2 3
競技場上選手BC(12)間距2-1=1

2.1 3衝突
第1輪
當前選手A B C D
選手數值1 2 3 4
數字表示0 1 2 3
競技場上選手AC(02)間距2-0=2

第2輪
當前選手A B C D
選手數值2 3 4 1
數字表示0 1 2 3
競技場上選手DB(31)間距1-3+4=2

第3輪
當前選手A B C D
選手數值3 4 1 2
數字表示0 1 2 3
競技場上選手CA(20)間距0-2+4=2   與   第1輪  衝突


3.1 4可行
第1輪
當前選手A B C D
選手數值1 2 3 4
數字表示0 1 2 3
競技場上選手AD(03)間距3-0=3

第2輪
當前選手A B C D
選手數值2 3 4 1
數字表示0 1 2 3
競技場上選手DC(32)間距2-3+4=3

第3輪
當前選手A B C D
選手數值3 4 1 2
數字表示0 1 2 3
競技場上選手CB(21)間距1-2+4=3

第4輪
當前選手A B C D
選手數值4 1 2 3
數字表示0 1 2 3
競技場上選手BA(10)間距0-1+4=3

4.2 3可行
第1輪
當前選手A B C D
選手數值1 2 3 4
數字表示0 1 2 3
競技場上選手BC(12)間距2-1=1

第2輪
當前選手A B C D
選手數值2 3 4 1
數字表示0 1 2 3
競技場上選手AB(01)間距1-0=1

第3輪
當前選手A B C D
選手數值3 4 1 2
數字表示0 1 2 3
競技場上選手DA(30)間距0-3+4=1

第4輪
當前選手A B C D
選手數值4 1 2 3
數字表示0 1 2 3
競技場上選手CD(23)間距3-2=1

5.2 4衝突
第1輪
當前選手A B C D
選手數值1 2 3 4
數字表示0 1 2 3
競技場上選手BD(13)間距3-1=2

第2輪
當前選手A B C D
選手數值2 3 4 1
數字表示0 1 2 3
競技場上選手AC(02)間距2-0=2

第3輪
當前選手A B C D
選手數值3 4 1 2
數字表示0 1 2 3
競技場上選手BD(31)間距1-3+4=2   與   第1輪  衝突

6.3 4可行
第1輪
當前選手A B C D
選手數值1 2 3 4
數字表示0 1 2 3
競技場上選手CD(23)間距3-2=1

第2輪
當前選手A B C D
選手數值2 3 4 1
數字表示0 1 2 3
競技場上選手BC(12)間距2-1=1

第3輪
當前選手A B C D
選手數值3 4 1 2
數字表示0 1 2 3
競技場上選手AB(01)間距1-0=1

第4輪
當前選手A B C D
選手數值4 1 2 3
數字表示0 1 2 3
競技場上選手AD(30)間距0-3+4=1

樣例模擬

Input:
7 3
Output:
1 6
2 5
3 4

第1輪
當前選手A B C D E F G
選手數值1 2 3 4 5 6 7
數字表示0 1 2 3 4 5 6
競技場上選手AF(05),BE(14),CD(23)

第2輪
當前選手A B C D E F G
選手數值2 3 4 5 6 7 1
數字表示0 1 2 3 4 5 6
競技場上選手GE(64),AD(03),BC(12)

第3輪
當前選手A B C D E F G
選手數值3 4 5 6 7 1 2
數字表示0 1 2 3 4 5 6
競技場上選手FD(53),GC(63),AB(01)

第4輪
當前選手A B C D E F G
選手數值4 5 6 7 1 2 3
數字表示0 1 2 3 4 5 6
競技場上選手EC(42),FB(51),GA(60)

第5輪
當前選手A B C D E F G
選手數值5 6 7 1 2 3 4
數字表示0 1 2 3 4 5 6 
競技場上選手DB(31),EA(40),FG(56)

第6輪
當前選手A B C D E F G
選手數值6 7 1 2 3 4 5
數字表示0 1 2 3 4 5 6
競技場上選手CA(20),DG(36),EF(45)

第7輪
當前選手A B C D E F G
選手數值7 1 2 3 4 5 6
數字表示0 1 2 3 4 5 6
競技場上選手BG(16),CF(25),DE(36)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章