大家應該都會玩「錘子剪刀布」的遊戲:兩人同時給出手勢,勝負規則如圖所示:
現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。
輸入格式:輸入第1行給出正整數n(<=105),即雙方交鋒的次數。隨後n行,每行給出一次交鋒的資訊,即甲、乙雙方同時給出的的手勢。c代表「錘子」、j代表「剪刀」、b代表「布」,第1個字母代表甲方,第2個代表乙方,中間有1個空格。
輸出格式:輸出第1、2行分別給出甲、乙的勝、平、負次數,數字間以1個空格分隔。第3行給出兩個字母,分別代表甲、乙獲勝次數最多的手勢,中間有1個空格。如果解不唯一,則輸出按字母序最小的解。
輸入樣例:10
c j
j b
c b
b b
b c
c c
c b
j b
b c
j j
輸出樣例:5 3 2
2 3 5
b bpat鏈結
b——0
c——1
j ——2
1.寫乙個轉化函式,將b,c,j轉化成數字0,1,2便於比較
2.判斷勝負條件,可以看出b,c,j之間形成乙個環,可以用如下**實現
if((na+1)%3 == nb) //甲勝
else
if(na == nb) //甲乙平
else
//乙勝
3.比較得到勝利次數最多的手勢,輸出資訊。
/**
*@tag pat_b_1018
*@date 2016-07-19 14:34:16-15:23
*@version 1.0
*@language c++
*@ranking 155/3936
*/#include #include #include /*將char轉化為int變與比較*/
int char_to_num(char ch)
/*將int轉化為char用來輸出*/
char num_to_char(int k)
int main()
, cntb[3]=; //用於統計勝平負次數
int timea[3]= ,timeb[3] = ; //用於統計每種手勢獲勝次數
scanf("%d", &n);
while(n--)
else
if(na == nb) //甲乙平
else
//乙勝
}maxa = timea[0];
ca = 'b';
maxb = timeb[0];
cb = 'b';
for(int i = 0; i<3; i++)
printf("%d",cnta[i]);
if(i < 2)
printf(" ");
else
printf("\n");
}for(int i = 0; i<3; i++)
printf("%d",cntb[i]);
if(i < 2)
printf(" ");
else
printf("\n");
}printf("%c %c\n",ca,cb);
return
0;}
1。最大的收穫是將這種形成環的字元轉化為數字比較,並且用類似
if((na+1)%3 == nb)
這樣的**進行判斷會方便很多。
2。由於scanf使用%c時會將換行符\n讀入,因此需要在合適的地方用getchar吸收空格。(以後碰到類似讀取字元的題目第一時間想要不要用getchar())。
3。甲贏得時候同時要記乙負,乙贏得時候同時要記加負,這是成對出現的。
PAT 乙級 1018 錘子剪刀布
時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 大家應該都會玩 錘子剪刀布 的遊戲 兩人同時給出手勢,勝負規則如圖所示 現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。輸入格式 ...
PAT乙級1018 錘子剪刀布
現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。輸入格式 輸入第1行給出正整數n 10 5 即雙方交鋒的次數。隨後n行,每行給出一次交鋒的資訊,即甲 乙雙方同時給出的的手勢。c代表 錘子 j代表 剪刀 b代表 布 第1個字母代表甲方,第2個代表乙方,中間有1個...
PAT 乙級 1018 錘子剪刀布
大家應該都會玩 錘子剪刀布 的遊戲 兩人同時給出手勢,勝負規則如圖所示 現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。輸入第 1 行給出正整數 n 10 5 即雙方交鋒的次數。隨後 n 行,每行給出一次交鋒的資訊,即甲 乙雙方同時給出的的手勢。c 代表 錘子...