1. 程式人生 > >「UVA1636」Headshot(概率

「UVA1636」Headshot(概率

std amp code else https pdf 兩種 你是 clas

題意翻譯

你有一把槍(左輪的),你隨機裝了一些子彈,你開了一槍,發現沒有子彈,你希望下一槍也沒有子彈,你是應該直接開一槍(輸出"SHOOT"),還是先轉一下,再開一槍(輸出"ROTATE")?如果兩種情況下一槍沒子彈的概率相等,輸出"EQUAL"。 註意:這裏轉一下,並不是轉到下一個位置,而是隨機轉,即等概率轉到子彈序列的每一個位置上。 手槍裏的子彈序列可以看做二進制序列,例如0011,第一次開槍前,一定在位置1或2(因為你的第一槍沒打出子彈去),因此開槍後位於位置2或3,如果此時開槍,有一半的概率打不出子彈。補充一下,子彈序列是環形序列,即0011等同於0110,1100,1001;

數據保證子彈序列長度為2~100

讀入為多組數據 輸入樣例 0011 0111 000111 輸出樣例 EQUAL ROTATE SHOOT

題目描述

PDF

輸入輸出格式

輸入格式:

輸出格式:

輸入輸出樣例

暫無測試點

題解

對於直接開槍,記一下有多少個$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 19
int 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(概率