1. 程式人生 > 實用技巧 >Codeforces 595C-Warrior and Archer(思維博弈)

Codeforces 595C-Warrior and Archer(思維博弈)

題目連結:https://codeforces.com/problemset/problem/595/C
CSDN食用連結:https://blog.csdn.net/qq_43906000/article/details/107833685

In the official contest this problem has a different statement, for which jury's solution was working incorrectly, and for this reason it was excluded from the contest. This mistake have been fixed and the current given problem statement and model solution corresponds to what jury wanted it to be during the contest.

Vova and Lesha are friends. They often meet at Vova's place and compete against each other in a computer game named The Ancient Papyri: Swordsink. Vova always chooses a warrior as his fighter and Leshac chooses an archer. After that they should choose initial positions for their characters and start the fight. A warrior is good at melee combat, so Vova will try to make the distance between fighters as small as possible. An archer prefers to keep the enemy at a distance, so Lesha will try to make the initial distance as large as possible.

There are n ( n is always even) possible starting positions for characters marked along the Ox axis. The positions are given by their distinct coordinates \(x_1, x_2, ..., x_n\), two characters cannot end up at the same position.

Vova and Lesha take turns banning available positions, Vova moves first. During each turn one of the guys bans exactly one of the remaining positions. Banned positions cannot be used by both Vova and Lesha. They continue to make moves until there are only two possible positions remaining (thus, the total number of moves will be n - 2). After that Vova's character takes the position with the lesser coordinate and Lesha's character takes the position with the bigger coordinate and the guys start fighting.

Vova and Lesha are already tired by the game of choosing positions, as they need to play it before every fight, so they asked you (the developer of the The Ancient Papyri: Swordsink) to write a module that would automatically determine the distance at which the warrior and the archer will start fighting if both Vova and Lesha play optimally.

Input
The first line on the input contains a single integer n (2 ≤ n ≤ 200 000, n is even) — the number of positions available initially. The second line contains n distinct integers \(x_1, x_2, ..., x_n (0 ≤ x_i ≤ 10^9)\), giving the coordinates of the corresponding positions.

Output
Print the distance between the warrior and the archer at the beginning of the fight, provided that both Vova and Lesha play optimally.

Examples
Input
6
0 1 3 7 15 31
Output
7

Input
2
73 37
Output
36

Note
In the first sample one of the optimum behavior of the players looks like that:

1.Vova bans the position at coordinate 15;
2.Lesha bans the position at coordinate 3;
3.Vova bans the position at coordinate 31;
4.Lesha bans the position at coordinate 1.
After these actions only positions 0 and 7 will remain, and the distance between them is equal to 7.

In the second sample there are only two possible positions, so there will be no bans.

題目大意:給你n個點在x軸上,Vova每次刪除一個點,Lesha每次刪除一個點,最後使得只剩下兩個點(n保證是個偶數),Vova先手。其中Vova想使得最後的兩個點的距離儘可能地小,Lesha想使得最後兩個點的距離儘可能地大。問最後剩下兩個點的距離是多少?

我們先來手動模擬一下樣例,Vova要使得最後的距離最小,那麼他肯定會看中\(0-1\)這個距離,而Lesha要使得距離最大,他肯定會看中\(0-31\)這個距離。那麼Vova先手的時候一定會刪去\(31\)這個點,之後Lesha會刪去\(1\)這個點,然後Vova刪\(15\),Lesha刪\(3\)。那麼最後就剩下了\(0-7\)

然後通過上面的模擬我們會發現,一旦一個起點\(p\)確定了,那麼這個起點是不會被改變的!而和他距離最近的\(\frac{n}{2}-1\)個點一定不會存在,那麼似乎答案也就固定了!那麼我們從1列舉過去,答案就是\(x_{\frac{n}{2}+p}-x_p\)的最小值。

以下是AC程式碼:(難以想象2300分的題就這麼兩行)

#include <bits/stdc++.h>
using namespace std;

const int mac=2e5+10;
const int inf=1e9+10;

int a[mac];

int main(int argc, char const *argv[])
{
    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; i++){
        ans=min(ans,a[i+n/2]-a[i]);
    }
    printf("%d\n",ans);
    return 0;
}