51nod 1267 四个数和为0 ( 如何用lower_bound查结构体里的值)

 
给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。

Input

 
  

第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)

Output

 
  

如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。

Input示例

 
  

5 -1 1 -5 2 4

Output示例

 
  

Yes


首先说一下题的思路,两两配对,用结构体存放两个数的和以及这两个数的坐标,再判断只要和为0并且坐标不同就可以

结构体里用二分用到了友元函数的知识(谭浩强牛逼)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=105;
const int mod=7;
ll N,A[1005],ans;
struct Why
{
    ll sum;
    ll x;
    ll y;
      friend bool operator <( Why a, Why b ) // 这就是重点了,需要手动在结构体里添加小于号的重载
      {
          return a.sum<b.sum;
      }
}H[1005*1005];
bool cmp(Why a,Why b)
{
    return a.sum<b.sum;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>N;
    for(int i=0;i<N;i++)
        cin>>A[i];
    for(int i=0;i<N;i++)
        for(int j=i+1;j<N;j++)
        {
            H[ans].sum=A[i]+A[j];   //求两两的和以及坐标
            H[ans].x=i;
            H[ans].y=j;
            ans++;
        }
    sort(H,H+ans,cmp);   
    ll t;
    for(int i=0;i<N;i++)
        for(int j=i+1;j<N;j++)
    {
        t=A[i]+A[j];
        Why k;  
        k.sum=0-t; // 对k赋值
        int L=lower_bound(H,H+ans,k)-H;  //这里二分查的是K这个结构体!不是数值
        if(H[L].sum+t==0&&H[L].x!=i&&H[L].x!=j&&H[L].y!=i&&H[L].y!=j)
        {
            cout<<"Yes"<<endl;
            return 0;
        }
    }
     cout<<"No"<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值