• 4个数的和为0 51nod 1267


    给出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

    解题思路:这道题被归纳在排序和二分的目录下,我们就试着通过排序和二分来解决这题。从n个数中找4个和为0的数,可以先将这些数两两组合,这样得
    到的数升序排序,通过
    二分查找,找到和为0的组合。不过这种算法只能勉强算为二分吧。
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define maxs 1010
     5 int num[maxs];
     6 struct node
     7 {
     8     int x;
     9     int y;
    10     int sum;
    11 }a[maxs*maxs];
    12 int my_cmp(node a,node b)
    13 {
    14     return a.sum<b.sum;
    15 }
    16 using namespace std;
    17 int main()
    18 {
    19     int n,i,j,flag;
    20     int k=0;
    21     flag=0;
    22     scanf("%d",&n);
    23     for(i=1;i<=n;i++)
    24     {
    25         scanf("%d",&num[i]);
    26         for(j=1;j<i;j++)
    27         {
    28             a[k].x=i;
    29             a[k].y=j;
    30             a[k].sum=num[i]+num[j];
    31             k++;
    32         }
    33     }
    34     sort(a,a+k,my_cmp);
    35     i=0;
    36     j=k-1;
    37     while(i<k)
    38     {
    39         if(a[i].sum+a[j].sum==0)
    40         {
    41           if(a[i].x!=a[j].x&&a[i].x!=a[j].y&&a[i].y!=a[j].x&&a[i].y!=a[j].y)
    42           {
    43               flag=1;
    44               break;
    45           }
    46           if(a[i].sum==a[i+1].sum)
    47           {
    48               i++;
    49           }
    50           else if(a[j].sum==a[j-1].sum)
    51           {
    52               j--;
    53           }
    54           else
    55           {
    56               i++;
    57               j--;
    58           }
    59         }
    60         else if(a[i].sum+a[j].sum<0)
    61         {
    62             i++;
    63         }
    64         else 
    65         {
    66             j--;
    67         }
    68     }
    69     if(flag)
    70     {
    71         printf("Yes
    ");
    72     }
    73     else
    74     {
    75         printf("No
    ");
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    奇虎360安全牛人全球挑战赛无线部…
    Portugal 2 1 minute has Pipansihuan Germany and USA tacit or kick the ball
    求最大公约数和最小公倍数
    JQuery的Ajax跨域请求的解决方式
    从Java到C++——从union到VARIANT与CComVariant的深层剖析
    抽卡概率的測试
    jquery序列化表单以及回调函数的使用
    Notepad++插件安装和使用和打开大文件
    Android开发遇到的问题
    bzoj3068: 小白树
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9866472.html
Copyright © 2020-2023  润新知