日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces - 594A Warrior and Archer(思维+博弈)

發布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 594A Warrior and Archer(思维+博弈) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出n個坐標軸上的點,兩個人輪流操作,每次取走其中的一個點,直到最后剩余兩個點為止,Vova先手,Vova希望兩個點的距離盡可能小,Lesha希望兩個點的距離盡可能大,問最后剩余兩個點的距離是多少

題目分析:這個題在讀題的時候就被樣例的解釋卡住了,不太明白為什么兩個人要那樣選擇,所以一下子陷入了思維定式,所以說有時候提示也可能是誤導人的。。吃了大虧了

首先這是一個無勝負求最優值的博弈,我們需要每一次分析兩個人的動作:

  • Vova希望距離盡可能小,所以他肯定會選擇左右兩個端點,因為萬一最后剩下了端點,距離肯定會比最優解要大,所以Vova不會選擇[l,r]中間的點
  • Lesha希望距離盡可能大,可以和Vova的情況反著分析,得到Lesha只會選擇[l,r]中間的點,而不會選擇左右的端點
  • 因為兩人一共會被拿掉n-2個點,且題目中保證了n是偶數,所以n-2也一定是偶數,兩個人分別取走了n/2-1個點

    那么假設其中的一種情況:

  • Vova一直選擇取走右端點,而Lesha一直選擇取走左數起第二個端點,這樣最后剩下的兩個點就是樣例1中的情況了
  • Vova第一次取走了左端點,剩下的都取右端點,而Lesha還是一直選擇取走左數起的第二個端點,這樣最后剩下的兩個點就是點2和點2+n/2
  • 再自己模擬幾次我們可以發現,區間長度,也就是左右端點的距離,始終固定在了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(思维+博弈)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。