CodeForces - 594A Warrior and Archer(思维+博弈)
生活随笔
收集整理的這篇文章主要介紹了
CodeForces - 594A Warrior and Archer(思维+博弈)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出n個坐標軸上的點,兩個人輪流操作,每次取走其中的一個點,直到最后剩余兩個點為止,Vova先手,Vova希望兩個點的距離盡可能小,Lesha希望兩個點的距離盡可能大,問最后剩余兩個點的距離是多少
題目分析:這個題在讀題的時候就被樣例的解釋卡住了,不太明白為什么兩個人要那樣選擇,所以一下子陷入了思維定式,所以說有時候提示也可能是誤導人的。。吃了大虧了
首先這是一個無勝負求最優值的博弈,我們需要每一次分析兩個人的動作:
因為兩人一共會被拿掉n-2個點,且題目中保證了n是偶數,所以n-2也一定是偶數,兩個人分別取走了n/2-1個點
那么假設其中的一種情況:
再自己模擬幾次我們可以發現,區間長度,也就是左右端點的距離,始終固定在了r-l=n/2,然而先手的是Vova,所以最后的答案一定是最小的才行,因為每個人都會選擇最優解執行
簡單證明到這里,我們可以直接下結論了,答案就是區間長度為n/2中,答案最小的那一組
簡單實現一下就ok了,代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;int a[N];int main() { // freopen("input.txt","r",stdin);int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",a+i);sort(a+1,a+1+n);int ans=inf;for(int i=1;i+n/2<=n;i++)ans=min(ans,a[i+n/2]-a[i]);printf("%d\n",ans);return 0; }?
總結
以上是生活随笔為你收集整理的CodeForces - 594A Warrior and Archer(思维+博弈)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 555A Ca
- 下一篇: HDU - 4388 Stone Gam