博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 64 C. Match Points 【二分思想】
阅读量:5088 次
发布时间:2019-06-13

本文共 946 字,大约阅读时间需要 3 分钟。

一 题面

  

二 分析

  根据题意很容易想到要去找满足条件的数,因为可以打乱输入的顺序,所以很容易想到二分。

  但是如果直接对输入的数组进行二分,如输入$a$,直接在数组里二分找$a+z$,就会出现不是最优解的情况,例如:

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

如果从第一个数直接二分那样找就会出问题。

  那么我们可以思考任意一个数组最优的解是多少?其实就是$n/2$。那么排序后,肯定可以从中间那个位置划分,后面的每个数可以找到最前面的数相对应。那么我们直接遍历一下右半部分的数组,为了找到更多的解,肯定要在满足条件的情况下,在左半部分数组中找最小的,相当于两个指针扫就可以了。

三 AC代码

1 #include 
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 else19 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 }

 

转载于:https://www.cnblogs.com/dybala21/p/10801987.html

你可能感兴趣的文章
二、spring中装配bean
查看>>
VIM工具
查看>>
javascript闭包
查看>>
@Column标记持久化详细说明
查看>>
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备...
查看>>
mysql8.0.13下载与安装图文教程
查看>>
站立会议08(冲刺2)
查看>>
url查询参数解析
查看>>
http://coolshell.cn/articles/10910.html
查看>>
[转]jsbsim基础概念
查看>>
DIV和SPAN的区别
查看>>
第一次使用cnblogs
查看>>
C#语法糖之 session操作类 asp.net
查看>>
2015 Multi-University Training Contest 3
查看>>
使用Gitblit 在windows 上部署你的Git Server
查看>>
217. Contains Duplicate
查看>>
vue2.0 关于Vue实例的生命周期
查看>>
jenkins 更换主数据目录
查看>>
Silverlight中恼人的g.i.cs错误
查看>>
SQLite 数据库增删改查
查看>>