此兩題很相似,可以用同一種方法解也可以用不同方法解 下面分別寫出兩種方法
Description:
暑假在家很閒的Z和C玩取紙牌遊戲:桌子上有M堆撲克牌,每堆牌的數量分別爲Ni(i=1…M)。兩人輪流進行;每走一步可以任意選擇一堆並取走其中的任意張牌;桌子上的紙牌全部取光,則遊戲結束;最後一次取牌的人爲勝者。
現在我們不想研究到底先手爲勝還是爲負,我只想問大家:
——“先手的人如果想贏,第一步有幾種選擇呢?”
Input:
輸入數據包含多個測試用例,每個測試用例佔2行,首先一行包含一個整數M(1<M<=100),表示紙牌的堆數,緊接着一行包含M個整數Ni(1<=Ni<=1000000,i=1…M),分別表示M堆紙牌的數量。M爲0則表示輸入數據的結束。
Output:
如果先手的人能贏,請輸出他第一步可行的方案數,否則請輸出0,每個實例的輸出佔一行。
Sample Input:
Sample Output:
這道題類似於問你有多少種方法能把這幾個數的異或變成0。
我們知道如果異或不爲0的時候我們只要用一堆的數減去異或的結果就可以了 ,
但是如果這個堆的數如果小於異或的結果就不行了
所以我們要看每個堆的數是否大於異或的結果就知道有多少種方法了
#include "stdio.h"
int a[111];
int main()
{
int n,i,j;
while (scanf("%d",&n)==1&&(n))
{
int t=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
t=t^a[i];
}
int total=0;
int tt;
for(i=0;i<n;i++)
{
tt=t^a[i];
if(tt<a[i])
total++;
}
printf("%d\n",total);
}
}
HDU2149
巴什博奕,最後一次取的獲勝
一堆裏有N個,每次最多取M個,最少取1個
輸入:
每行N,M,數據有多組,到EOF爲止
限制:
0<N,M<1100
輸出:
每行若干個整數或一個字符串,如果先手必敗,則字符串爲
none
如果先手必勝,輸出首次取時所有必勝取法
兩個整數之間有一個空格
多組輸出之間沒有空行
樣例輸入:
4 2
3 2
3 5
樣例輸出:
1
none
3 4 5
分析 : 很容易得出m<=n時 第一步可取m->n任意一個數
m>n時 由公式得取m%(n+1)
#include<stdio.h>
int main()
{
int n,m;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(m%(n+1)==0)
{
printf("none\n");
continue;
}
if(m<=n)
{
printf("%d",m);
for(int i=m+1;i<=n;i++)
printf(" %d",i);
printf("\n");
continue;
}
printf("%d\n",m%(n+1));
}
return 0;
}