思维:求abs(X-Y)>=Z的最大匹配对数

题目链接:http://codeforces.com/contest/1156/problem/C
题目大意:给你一个n个元素的数组,和一个z。求使得 (a[i]-a[j])>=z) 的最大对数。(n<=2e5)

思路:最开始的思路 贪心是把a加入multiset每次查找>=s.begin()+z的元素。同时删除两个元素。
然后推出一个样例:证明并不可行。
4 3
1 4 5 7
如果(1, 4)匹配。那么只有一对。如果(1, 5), (4, 7)就有两对。

正确思路:把a数组排序。分成2半。前面与后面匹配。

#include<bits/stdc++.h>
#define LL long long

int a[200005];
int main()
{
    int n, m;
    scanf("%d%d",&n,&z);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a, a+n);
    int L=0, R=n/2, ans=0;
    while(L<n/2&&R<n)
    {
        if(a[R]-a[L]>=z)//满足条件
        {
            ans++;
            L++, R++;
        }
        else
        {
            R++;		//不满足条件时。R++。因为a[L]最小。如果a[L]都不能与a[R]匹配。a[i>L]就更不能与a[R]匹配。
        }
    }
    cout<<ans<<endl;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值