upc 6622 博弈

传送:http://exam.upc.edu.cn/problem.php?id=6622&csrf=lpuka4IT2Kf0lWruDcXKVsvrNrLE4ajt

Sample Input 1

Copy

3 100 100
10 1000 100

Sample Output 1

Copy

900

If X draws two cards first, Y will draw the last card, and the score will be |1000−100|=900.


Sample Input 2

Copy

3 100 1000
10 100 100

Sample Output 2

Copy

900

If X draws all the cards first, the score will be |1000−100|=900.


Sample Input 3

Copy

5 1 1
1 1 1 1 1

Sample Output 3

Copy

0

Sample Input 4

Copy

1 1 1
1000000000

Sample Output 4

Copy

999999999

题意:两个人初始手上分别有Z,W两个牌,一副N个牌在桌面上,每轮取任意>0数目的牌,将手上的牌替换成取得牌最下面那张,然后剩余的扔掉,双方轮流操作直至无牌。结果是两人手上牌的差值K,先手令K尽量大,后手令K尽量小,问结果是什么。

思路:答案是max(a[n]-a[n-1], a[n]-w),这种题的思路我一直都比较模糊,记下我目前的想法,因为先手要最大化差值,开局他可以取a[n-1]剩下a[n],或者取a[n]直接结束游戏,这两种情况是先手100%能达到的。如果先手不这样做,他取得牌点数必须>=a[n-1],否则后手会直接拿掉a[n],这样先手就违背他的最大化差值的使命了。然后同理后手就取<=a[n-1]的牌,否则将违背他的使命,这样最终肯定是分别拿到a[n]和a[n-1]的。

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAX=10000;

typedef long long ll;
ll n,z,w;
ll a[3000];
int main(){
    cin>>n>>z>>w;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    n==1?cout<<a[1]-w<<endl:cout<<max(llabs(a[n-1]-a[n]),llabs(a[n]-w));

    return 0;
}

猜你喜欢

转载自blog.csdn.net/c___c18/article/details/81486364
UPC