zoukankan      html  css  js  c++  java
  • 51nod 1267【二分】

    思路:
    首先我们能够很容易地想到,4个数的和,拆成两两相加:a+b=-c-d;
    我们也能很轻松地求出两两之和,但是呢。。不同的和会存在相同的值相加,所以还要排除这个条件。具体操作就是标记一下,然后将和二分来操做

    #include <stdio.h>
    #include <map>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    typedef long long LL;
    
    const int N=1e3+10;
    
    int a[N];
    struct asd{
        int x,y;
        int sum;
    };
    asd q[N*N];
    int n;
    
    bool cmp(asd s1,asd s2)
    {
        return s1.sum<s2.sum;
    }
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int num=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                q[num].x=i;q[num].y=j;
                q[num++].sum=a[i]+a[j];
            }
        }
        sort(q,q+num,cmp);
        int s,t;
        s=0;
        t=num-1;
        while(s<num)
        {
            if(q[s].sum+q[t].sum==0)
            {
                if(q[s].x!=q[t].x&&q[s].x!=q[t].y&&q[s].y!=q[t].x&&q[s].y!=q[t].y)
                {
                    printf("Yes
    ");
                    return 0;
                }
                if(q[s].sum==q[s+1].sum)
                    s++;
                else if(q[t].sum==q[t-1].sum)
                    t--;
                else
                {
                    s++;
                    t--;
                }
            }
            else if(q[s].sum+q[t].sum<0)
                s++;
            else
                t--;
        }
        printf("No
    ");
        return 0;
    }
    
    
  • 相关阅读:
    [Java复习] 缓存Cache part2
    [Java复习] 多线程 并发 JUC 补充
    [Java复习] 缓存Cache part1
    [Java复习] MQ
    [Java复习] 设计模式 Design Pattern
    [Java复习] Spring Cloud
    [Java复习] Spring Boot
    [Java复习] JVM
    [Java复习] Spring 常见面试问题
    关于nginx的源码安装方式
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934830.html
Copyright © 2011-2022 走看看