zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 64 C. Match Points 【二分思想】

    一 题面

      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 }
  • 相关阅读:
    话说 SVN 与 Git 之间的区别
    CentOS 7 之安装 Oracle 11gR2
    @meda媒体查询
    为样式找到应用目标-CSS选择器
    JQuery和原生JavaScript实现网页定位导航特效
    CSS代码缩写
    认识CSS样式
    文档类型、DOCTYPE切换和浏览器模式
    MIME 参考手册
    微格式(microformat)
  • 原文地址:https://www.cnblogs.com/dybala21/p/10801987.html
Copyright © 2011-2022 走看看