問題描述
閒暇時,福爾摩斯和華生玩乙個遊戲:
在n張卡片上寫有n個整數。兩人輪流拿走一張卡片。要求下乙個人拿的數字一定是前乙個人拿的數字的約數或倍數。例如,某次福爾摩斯拿走的卡片上寫著數字「6」,則接下來華生可以拿的數字包括:
1,2,3, 6,12,18,24 ….
當輪到某一方拿卡片時,沒有滿足要求的卡片可選,則該方為輸方。
請你利用計算機的優勢計算一下,在已知所有卡片上的數字和可選哪些數字的條件下,怎樣選擇才能保證必勝!
當選多個數字都可以必勝時,輸出其中最小的數字。如果無論如何都會輸,則輸出-1。
輸入格式
輸入資料為2行。第一行是若干空格分開的整數(每個整數介於1~100間),表示當前剩餘的所有卡片。
第二行也是若干空格分開的整數,表示可以選的數字。當然,第二行的數字必須完全包含在第一行的數字中。
輸出格式
程式則輸出必勝的招法!!
樣例輸入
2 3 6
3 6
樣例輸出
3 樣例輸入
1 2 2 3 3 4 5
3 4 5
樣例輸出
4博弈論果然還是很難
總之分析下必勝態和必敗態,如果我拿了一張牌,並且沒有其他的約數或倍數可拿,顯然這是我的必勝態。如果在這之前,對方也拿了一張牌,顯然對他來說他拿的那張牌就是必敗態,所以這種博弈裡,必勝態和必敗態是交替出現的
但要確定是必敗還是必勝,不抽到最後一張還是不能確定,所以要把所有可能的抽卡情況搜尋出來,只有確定抽了這張牌,之後所有的情況都是必敗,我才能確定這張牌是必勝
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define maxn 100005
#define mod 1000000007
using
namespace
std;
int num[200];
vector
choice;
vector
table[200];
int dfs(int x) //必敗態和必勝態輪流出現,所以要找取第乙個x時到底是必勝還是必敗
}return -1; //沒有下乙個約數或倍數了,取到這個x的人必勝
}int main()
while(1)
for(int i=1; i<=100; ++i)
if(num[i])
sort(choice.begin(),choice.end());
int flag=0;
for(int i=0;iint t=dfs(choice[i]);
if(t==-1)
num[choice[i]]++;
}if(!flag)
printf("-1\n");
return
0;}
藍橋杯 約數倍數選卡片
問題描述 閒暇時,和華生玩乙個遊戲 在n張卡片上寫有n個整數。兩人輪流拿走一張卡片。要求下乙個人拿的數字一定是前乙個人拿的數字的約數或倍數。例如,某次福爾摩斯拿走的卡片上寫著數字 6 則接下來華生可以拿的數字包括 1,2,3,6,12,18,24 當輪到某一方拿卡片時,沒有滿足要求的卡片可選,則該方...
約數倍數選卡片
問題描述 閒暇時,福爾摩斯和華生玩乙個遊戲 在n張卡片上寫有n個整數。兩人輪流拿走一張卡片。要求下乙個人拿的數字一定是前乙個人拿的數字的約數或倍數。例如,某次福爾摩斯拿走的卡片上寫著數字 6 則接下來華生可以拿的數字包括 1,2,3,6,12,18,24 當輪到某一方拿卡片時,沒有滿足要求的卡片可選...
13 4 約數倍數選卡片
閒暇時,福爾摩斯和華生玩乙個遊戲 在n張卡片上寫有n個整數。兩人輪流拿走一張卡片。要求下乙個人拿的數字一定是前乙個人拿的數字的約數或倍數。例如,某次福爾摩斯拿走的卡片上寫著數字 6 則接下來華生可以拿的數字包括 1,2,3,6,12,18,24 當輪到某一方拿卡片時,沒有滿足要求的卡片可選,則該方為...