GYM 100694D - Unfair Game (简单构造)

本文介绍了一种构造三个特殊骰子的方法,确保在已知对手选择的情况下,总能从剩余两个骰子中选出胜率更高的一个。通过将[1,3*N]区间内的数值合理分配到三个骰子上,实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

构造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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值