传送: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;
}