「UVA1636」Headshot(概率
阿新 • • 發佈:2018-10-26
std amp code else https pdf 兩種 你是 clas
PDF
題意翻譯
你有一把槍(左輪的),你隨機裝了一些子彈,你開了一槍,發現沒有子彈,你希望下一槍也沒有子彈,你是應該直接開一槍(輸出"SHOOT"),還是先轉一下,再開一槍(輸出"ROTATE")?如果兩種情況下一槍沒子彈的概率相等,輸出"EQUAL"。 註意:這裏轉一下,並不是轉到下一個位置,而是隨機轉,即等概率轉到子彈序列的每一個位置上。 手槍裏的子彈序列可以看做二進制序列,例如0011,第一次開槍前,一定在位置1或2(因為你的第一槍沒打出子彈去),因此開槍後位於位置2或3,如果此時開槍,有一半的概率打不出子彈。補充一下,子彈序列是環形序列,即0011等同於0110,1100,1001;
數據保證子彈序列長度為2~100
讀入為多組數據 輸入樣例 0011 0111 000111 輸出樣例 EQUAL ROTATE SHOOT
題目描述
輸入輸出格式
輸入格式:
輸出格式:
輸入輸出樣例
暫無測試點
題解
對於直接開槍,記一下有多少個$0$,再記一下其中有多少個$0$的後一位為$1$,掛掉的概率為$(01的數量)/(0的數量)$.
轉一下的概率就是$(0的數量)/(序列長度)$
然後比較一下就好了.
懶得處理精度,用了交叉相乘.
1 qwerta 2 UVA1636 Headshot Accepted 3 代碼 C++,0.46KB 4 提交時間 2018-10-26 17:13:47 5 耗時/內存 0ms, 0KB 6 7 #include<iostream> 8 #include<cstdio> 9 using namespace std; 10 string s; 11 int main() 12 { 13 while(cin>>s) 14 { 15 int zr=0;//記錄0的個數 16 for(int i=0;i<s.length();++i) 17 if(s[i]==‘0‘)zr++; 18 //shoot 19int dy=0;//記錄01的個數 20 for(int i=0;i<s.length()-1;++i) 21 if(s[i]==‘0‘&&s[i+1]==‘1‘)dy++; 22 int n=s.length(); 23 if(s[n-1]==‘0‘&&s[0]==‘1‘)dy++;//別忘了它是環形的 24 // 25 int y=s.length()-zr;//算1的個數 26 if(dy*n<zr*y){cout<<"SHOOT"<<endl;}//如果dy/zr<y/n 27 else if(dy*n==zr*y){cout<<"EQUAL"<<endl;} 28 else cout<<"ROTATE"<<endl; 29 } 30 return 0; 31 }
「UVA1636」Headshot(概率