题意
构造3个N面的骰子,使知道对手选了哪枚骰子的情况下,都能在剩下的两枚中选出赢面更大的骰子。在[1,3*N]中每个数字都使用一次。
解题思路
猜想将[1,3*N]分成N个区间,每个骰子在每个区间都取一个数。即:
1,5,9,10,14……
2,6,7,11,15……
3,4,8,12,13……
暴力验证一遍,发现除了1,2,4都是可行,而1,2显然是不可行的。交了一遍,WA了。所以4也是有解的,手动构造即可。
代码
#include<bits/stdc++.h>
#define N 10000005
using namespace std;
typedef long long ll;
int a[3][1005];
int k(int a,int b){
return a%b==0?b:a%b;
}
int main()
{
int n;
scanf("%d",&n);
if(n<3){
printf("FAIL\n");
return 0;
}
if(n==4){
printf("WIN\n");
printf("1 6 8 11\n4 5 7 10\n2 3 9 12\n");
return 0;
}
for(int i=0;i<3;i++)
for(int j=1;j<=n;j++){
a[i][j]=(j-1)*3+k(j+i,3);
}
printf("WIN\n");
for(int i=0;i<3;i++){
for(int j=1;j<=n;j++){
printf("%d%s",a[i][j],j==n?"\n":" ");
}
}
return 0;
}