1. 程式人生 > >Educational Codeforces Round 64 C. Match Points 【二分思想】

Educational Codeforces Round 64 C. Match Points 【二分思想】

urn 就是 mat main turn 個數 分數 ali -s

一 題面

  C. Match Points

二 分析

  根據題意很容易想到要去找滿足條件的數,因為可以打亂輸入的順序,所以很容易想到二分。

  但是如果直接對輸入的數組進行二分,如輸入$a$,直接在數組裏二分找$a+z$,就會出現不是最優解的情況,例如:

$4\ 8\ 9\ 12$ 其中$z = 4$

如果從第一個數直接二分那樣找就會出問題。

  那麽我們可以思考任意一個數組最優的解是多少?其實就是$n/2$。那麽排序後,肯定可以從中間那個位置劃分,後面的每個數可以找到最前面的數相對應。那麽我們直接遍歷一下右半部分的數組,為了找到更多的解,肯定要在滿足條件的情況下,在右半部分數組中找最小的,相當於兩個指針掃就可以了。

三 AC代碼

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 2e5 + 10;
 4 int Data[MAXN];
 5 
 6 int main()
 7 {
 8     ios::sync_with_stdio(false);
 9     int n, z, ans = 0;
10     int l, r;
11     cin >> n >> z;
12     for(int i = 0; i < n; i++)
13
cin >> Data[i]; 14 sort(Data, Data + n); 15 l = 0; 16 if(n % 2 == 1) 17 r = n/2 + 1; 18 else 19 r = n/2; 20 while(r < n) 21 { 22 if(Data[l] + z <= Data[r]) 23 { 24 ans++; 25 l++; 26 }
27 r++; 28 } 29 cout << ans << endl; 30 return 0; 31 }

Educational Codeforces Round 64 C. Match Points 【二分思想】