賽碼網編程練習(五)


博弈問題

題目描述

小賽是一名聰明的程序員。他的聰明確保他一定會應聘成功^_^~在應聘會上,人事主管向小賽提出了這樣一個問題——這次招聘的規則是這樣的。

一共有n個人(n>1)參加應聘。人事主管事先選好了一個正整數x,他會把自己選的這個數x告訴前來應聘的每一個人。

每個人(包括小賽)都可以選擇1~m中的任意一個實數(就不要問實數是怎么選的啦2333)。參加應聘的人都不會知道其他人選擇了什么。最后所有人都選完數后,我們會把所有數加起來,然后求個平均數(即除以(n+1)),再乘上p/q,設得到的結果為y(y也是個實數).所有選擇的數最接近y的應聘者會被企業選中。

這n個應聘者都同樣足夠聰明,這n個應聘者都知道其他人也足夠聰明,這n個應聘者都想被企業選中。請你告訴我們,小賽在這種情況下,需要選擇1~m中的哪個數才會被企業選中呢?

輸入

 

第一行三個正整數n,m,x,其中n表示參加應聘的人數,m表示應聘者選擇數的范圍是1~m,x表第一行三個正整數n,m,x,其中n表示參加應聘的人數,m表示應聘者選擇數的范圍是1~m,x表示人事主管選擇的數x.

第二行兩個正整數p,q,表示算出的平均數要乘上p/q.

 

數據保證——p<=q

數據保證——題目有解且有唯一解。

數據保證——

對於30%的測試點,2<=n<=5,1<=m,x<=5,1<=p<=q<=5

對於70%的測試點,2<=n<=100,1<=m,x<=100,1<=p<=q<=100

對於100%的測試點,2<=n<=10000,1<=m,x<=10000,1<=p<=q<=10000

示人事主管選擇的數x.

第二行兩個正整數p,q,表示算出的平均數要乘上p/q.

 

數據保證——p<=q

數據保證——題目有解且有唯一解。

數據保證——

對於30%的測試點,2<=n<=5,1<=m,x<=5,1<=p<=q<=5

對於70%的測試點,2<=n<=100,1<=m,x<=100,1<=p<=q<=100

對於100%的測試點,2<=n<=10000,1<=m,x<=10000,1<=p<=q<=10000

輸出

 

輸出一行,包含一個1~m范圍內的實數,表示小蘑應當選擇的數。(四舍五入保留2位小數)

樣例輸入

 

2 4 9

2 3

樣例輸出

 

3.60

 

這個題目列個方程求解然后用程序輸出就行,假定所有人的最優都是同一個數,設應該選擇的數為sel,則方程為(n*sel+x)/(n+1)*p/q=sel。求解sel即可。代碼如下:

 

這個題目有兩點注意的地方,第一就是輸入都是整數,但是結果是實數,所以需要考慮,另外就是最后輸出的結果要限定在1——m之間,否則出錯,我一開始就沒考慮到這點,想了好久。以后注意。

另外就是freopen函數的使用,輸入輸出重定向很有用。

#include"stdafx.h"
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<math.h>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
int casenum, casei;

void fre()
//輸出重定向
{
    freopen("E:\\input.txt", "r", stdin);
    freopen("E:\\output.txt", "w", stdout);
}


int main()
{
    int n, m, x;
    int p, q;
    fre();
    while (scanf("%d%d%d", &n, &m, &x) != EOF){
        scanf("%d%d", &p, &q);
        //要想讓整數處理時是double,最前面1.0乘即可
        double ans = 1.0*(x*p) / ((n + 1)*q - n*p);
        //記得輸出條件要判定
        if (ans < 1)ans = 1;
        if (ans > m)ans = m;
        printf("%.2f\n", ans);
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM