Codeforces C Match Points(二分贪心)
题目描述:
Match Points
time limit per test
2 seconds
memory limit per test
256 mega bytes
input
standard input
output
standard output
You are given a set of points x1, , ..., x**n
Two points iand jcan be matched with each other if the following conditions hold:
- neither i nor j is matched with any other point;
- |x**i−x**j|≥z.
What is the maximum number of pairs of points you can match with each other?
Input
The first line contains two integers n
and (2≤n≤2⋅105) — the number of points and the constraint on the distance between matched points, respectively.
The second line contains n integers , x2 (1≤x**i≤109
Output
Print one integer — the maximum number of pairs of points you can match with each other.
Examples
Input
Copy
4 2
1 3 3 7
Output
Copy
2
Input
Copy
5 5
10 9 5 8 7
Output
Copy
1
Note
In the first example, you may match point 1
with point (|3−1|≥2 with point 4).
In the second example, you may match point 1
with point (|5−10|≥5)
思路:
刚开始就想的是匹配嘛,一看到匹配想到二分图最大匹配,嗯~匈牙利算法,建个图,跑一下试试。不过看样子数据范围有点大,有超时的可能(必然)。不管了,想到这个先写写吧。怎么建图呢?把满足条件的两个点之间连一条边,等等,好像有重复啊,我一个数匹配了就不能再用了啊。我自以为可以解决问题的做法:对一个数来说枚举从他的下一个到末尾。是不是就可以了呢?
不是。我真的是,刚学了二分图就想什么都往上面套,明明怎么建图都还没学过,这样还是不可能建出正确的图。因为一个顶点被用了之后是不知道知道它已经被用了的,这就建不出二分图。
天真的我以为模板写错了,又用了最大流来了好几遍,一直WA,真好。
我就想到二分,然后有一种直觉告诉我,我把数组排个序,然后用lower_bound给每个数来一下查找满足条件的最小元素。但也是直觉产生怀疑,为什么,这样贪心正确吗?有没有可能这里lower_bound了配对以后就影响了后面元素的配对,而且是连环影响,本来可以产生更多配对,结果由于贪心配对数变少了。怀疑是正确的,比如一组例子:
4 2
1 3 4 5
如果找这种方法只能配出1,3一对来,实际上是两对:1,4和3,5
然后我想,那我统计一下元素可能配对的次数,从可能配对次数最小的开始配对,因为它们最不容易配对,优先满足它们可能会让总数大一些,于是又用了结构体排序什么的,也不正确。
眼看着我里正确的思路越来越远,也越来越想不到正确的解。知道是二分复杂度才能下去,知道是贪心才能得出正确解,但我的思路好像很奇怪?
现在来看看正确的思路,我们想最优的情况是什么?是每个元素都配了对,一共n/2对,是不是?那么这个时候配对情况是怎样的呢?是不是前一半小的配后一半大的?如果这点想到了,离正确二分就不远了。就是二分这个排序好的数组,用后一半跟前一半的元素配对,具体的,设中间为mid,最后一个从mid-1开始往前面配对,一旦出现配对元素,答案统计,并更新下一次配对开始的起点为当前位置的前一个位置。(为什么?因为当前如果配好了对,由于数组已经排好了序,下一次是比这次参加配对的后半段的元素更小的一个元素,这个位置及以后的位置上的元素明显不可能满足差值大于z的条件)。
代码:
#include <iostream>
#include <algorithm>
#define max_n 200005
using namespace std;
int n;
int z;
int a[max_n];
int ans = 0;
int main()
{
cin >> n >> z;
for(int i = 0;i<n;i++)
{
cin >> a[i];
}
sort(a,a+n);
int mid=n/2;
int l = mid-1;
for(int i = n-1;i>=mid;i--)
{
while(l>=0)
{
if(abs(a[l]-a[i])>=z)
{
ans++;
l--;
break;
}
l--;
}
}
cout << ans << endl;
return 0;
}
后记:
学习模板固然有一定的作用,可是如果在学习过程中产生了依赖,什么都想套用模板而不去思考,后果是什么?什么题都想先百度题解,不认真思考的后果是什么?orz
我虽然菜,而且菜啊
Codeforces C Match Points(二分贪心)的更多相关文章
- codeforces 803D Magazine Ad(二分+贪心)
Magazine Ad 题目链接:http://codeforces.com/contest/803/problem/D ——每天在线,欢迎留言谈论. 题目大意: 给你一个数字k,和一行字符 例: g ...
- Codeforces 1132D - Stressful Training - [二分+贪心+优先队列]
题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有 $n$ 个学生,他们的电脑有初始电量 $a[1 \sim n]$,他们的电脑每分钟会耗 ...
- CodeForces - 343C Read Time (二分+贪心)
题意:有N个指针头,M个标记,用这N个针头扫描所有的标记,针头之间互不影响,求扫描完M个标记的最短时间 分析:二分搜答案,mid为时间限制,则只要所有的点在mid秒内被扫描到即可. 对于每个指针,若其 ...
- Educational Codeforces Round 64 C. Match Points 【二分思想】
一 题面 C. Match Points 二 分析 根据题意很容易想到要去找满足条件的数,因为可以打乱输入的顺序,所以很容易想到二分. 但是如果直接对输入的数组进行二分,如输入$a$,直接在数组里二分 ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心
/** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...
- 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心
题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...
- codeforces Gym 100338E Numbers (贪心,实现)
题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...
- Codeforces_732D_(二分贪心)
D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
随机推荐
- 【C/C++开发】容器set和multiset,C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())
一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...
- Prometheus安装部署说明
本文主要介绍了如何二进制安装Prometheus.使用 Node Exporter 采集主机信息并使用Grafana来进行图形化的展示. 1. 安装Prometheus Server Promethe ...
- k8s+Jenkins+GitLab-自动化部署项目
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 此文阅读目录: 1.闲聊 ...
- 039 RabbitMq及数据同步01
1.RabbitMq (1)问题引出 目前我们已经完成了商品详情和搜索系统的开发.我们思考一下,是否存在问题? 商品的原始数据保存在数据库中,增删改查都在数据库中完成. 搜索服务数据来源是索引库,如果 ...
- kubernetes支持local volume
目录 local volume 创建一个storage class 静态创建PV 使用local volume PV 动态创建PV local volume kubernetes从1.10版本开始支持 ...
- Tomcat 类加载器的实现
Tomcat 内部定义了多个 ClassLoader,以便应用和容器访问不同存储库中的类和资源,同时达到应用间类隔离的目的.本文首发于公众号:顿悟源码. 1. Java 类加载机制 类加载就是把编译生 ...
- spring Aop切面中的@Before @Around等执行顺序与请求参数统一解码
1.背景 在实际开发中,我可能会对请求接口做统一日志输出,或者统一参数解析,验签,统一响应加密等,通常会用到aop,实际案例如下 2.代码 package com.qianxingniwo.log; ...
- 阿里云服务器连接ftp服务(软件的使用)
首先你需要有一个阿里云的ECS服务器 开通了宽带之后,ECS服务器就可以上网了 可以在本地电脑cmd控制台运行mstsc.exe启动远程桌面连接 windows+R 计算机名输入ECS服务器的公网ip ...
- C# Winform 只允许输入数字
if (!(e.KeyChar >= '0' && e.KeyChar <= '9' || e.KeyChar == '.')) e.Handled = true; if ...
- C#读写修改设置调整UVC摄像头画面-全景
有时,我们需要在C#代码中对摄像头的全景进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...