Educational Codeforces Round 64 C. Match Points 【二分思想】
阿新 • • 發佈:2019-05-02
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++) 13cin >> 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 【二分思想】