1. 程式人生 > >Codeforces 570B Simple Game 概率求解,簡單數學思維

Codeforces 570B Simple Game 概率求解,簡單數學思維

題目描述了這麼一個情景,給定一個範圍 1~n ,兩個人(簡記為 a和b)各自隨機選一個整數,然後再在1~n這個範圍內隨機找一個整數(1~n所有整數被選到的概率是相等的),這兩個人誰選擇的數更接近這個隨機數誰就贏。

現在給出選數範圍,給出其中一方(記做b)已經選好的數(記做m),問a應該選哪個數,才能使得a獲勝的機率儘可能大?如果有不唯一的答案,就輸出其最小值

畫根數軸自己想象一下就明白了,如果b選好的數m更偏向1,那麼a應該選m+1,如果更偏向n,a就應該選m-1,

然後就是有一個我覺得有問題的地方:當範圍侷限於1這一個數,然後b選的數也是1的時候,a是不可能贏得,因為這個時候a沒得選只能也選1,然而題目中有約定,如果兩人選的數字同隨機數的距離相等,則判定b贏,也就是說這個情況下a必輸

比賽時第一次提交程式碼的時候覺得這個地方是有爭議不會出資料,結果,呵呵了,交上去先過了pretest,然後就被hack了,這場比賽有好多人憑藉hack這個題就加了上千分。。這特麼冤死啊。。

可以解釋:題目只是讓你輸出成功概率“最大”的點,最大也可以是0啊,不輸出才叫有問題。

莫想當然

By skyword, contest: Codeforces Round #316 (Div. 2), problem: (B) Simple Game, Accepted, #
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
#include<string>
#include<cmath>
#include<stack>
//#define file
#define maxn 100010
using namespace std;
int m,n;
int main()
{
    scanf("%d%d",&n,&m);
    int t=m-1;
    int p=m+1;
    if(m==1&&n==1)
    {
        printf("1\n");
    }
    else
    {
        if(m>(n/2))
        {
            printf("%d\n",t);
        }
        else
        {
            printf("%d\n",p);
        }
    }
}

同場比賽還有個A題,是個簡單模擬,略考驗程式碼水平。。很簡單,就不寫題解了

rating終於漲了一點,還算有點自信

加油吧。。