1. 程式人生 > >華東交通大學2018年ACM“雙基”程式設計競賽 D

華東交通大學2018年ACM“雙基”程式設計競賽 D

  摸魚之王MIKU醬想去埃及玩,需要一個人陪同。小新和小磊都想陪MIKU醬一起去,但名額只有一個。所以小磊和小新決定用一個小遊戲來決定誰和MIKU醬出去玩。
    遊戲的道具是21張塔羅牌,塔羅牌分為大牌和小牌,其中大牌有22張,分別是編號為0的愚者(The Fool)和編號為21的世界(The World)。
給出22張的塔羅牌以及其編號如下:
【0】愚者(The Fool,0)
【1】魔術師(The Magician,I)
【2】女祭司(The High Priestess,II)
【3】皇后(The Empress,III)
【4】皇帝(The Emperor,IV)
【5】教皇(The Hierophant,or the Pope,V)
【6】戀人(The Lovers,VI)
【7】戰車(The Chariot,VII)
【8】力量(Strength,VIII)
【9】隱士(The Hermit,IX)
【10】命運之輪(The Wheel of Fate,X)
【11】正義(Justice,XI)
【12】倒吊人(The Hanged Man,XII)
【13】死神(Death,XIII)
【14】節慾(Temperance,XIV)
【15】惡鬼(The Devil ,XV)
【16】塔(The Tower,XVI)
【17】星辰(The Star,XVII)
【18】月亮(The Moon,XVIII)
【19】太陽(The Sun,XIX)
【20】審判(Judgement,XX)
【21】世界(The World,XXI)
    遊戲的規則是:將22張塔羅牌打亂,然後分別從中翻開一張卡,兩張卡的權值和如果為正數,則小新獲勝,如果為負數,則小磊獲勝。如果這張卡是正位(即是正向的),那麼這張牌的權值就為他的序號,如果是逆位(反向),則權值就為序號的相反數。例如:正位的世界的權值為21,逆位的死神的權值為 -13。因為愚者的正逆位都是0,為了讓遊戲更有趣,他們附加了一條規則:如果翻出了正位的愚者,那麼直接判定小新獲勝,如果出現了逆位的愚者,那麼小磊獲勝。
    大家都不知道,小磊其實具有將時間暫停幾十秒的能力。但是小磊並不想用這個能力作弊,他只想在小新翻開牌的瞬間看看他翻到的是什麼牌,然後計算自己可能獲勝的機率。

輸入描述:

多組輸入,輸入一個數字a(0<=a<=21)和一個數字b(0<=b<=1),a代表小新翻出來的牌的序號,b代表小新翻出卡的位序,b為0則為逆位,為1則為正位,如果輸入為"-1 -1",終止輸入。

輸出描述:

輸出格式為:a/b 該分式為最簡式。中間的槓為字元“/”。如果結果為0,則輸出“owatta”。如果已經獲勝(小新的牌為逆位愚者)則輸出“1”。
示例1

輸入

複製
0 1

輸出

複製
owatta




 1 #include <cstdio>
 2
#include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <cmath> 11 #include <cstdlib> 12 #include <ctime> 13 using
namespace std; 14 typedef long long ll; 15 int a,b; 16 int c[2]={1,-1}; 17 int main() 18 { 19 while(~scanf("%d%d",&a,&b)){ 20 if(a==-1&&b==-1) break; 21 else if(a==0&&b==1){ 22 printf("owatta\n"); 23 } 24 else if(a==0&&b==0){ 25 printf("1\n"); 26 } 27 else{ 28 int ret=0; 29 if(b==0) a=-a; 30 for(int i=0;i<=21;i++){ 31 if(i==abs(a)) continue;//不放回 32 if(i==0) { 33 ret++;//抽到0時的逆位 34 continue; 35 } 36 for(int j=0;j<2;j++){ 37 if(a+i*c[j]<0) ret++; 38 } 39 } 40 if(ret==0){ 41 printf("owatta\n"); 42 } 43 else if(ret==42){ 44 printf("1\n"); 45 } 46 else{ 47 int g=__gcd(ret,42); 48 ret/=g; 49 printf("%d/%d\n",ret,42/g); 50 } 51 } 52 } 53 return 0; 54 }