• 1090 3个数和为0


    1090 3个数和为0

    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
    收藏
    关注
    给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
    Input
    第1行,1个数N,N为数组的长度(0 <= N <= 1000)
    第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
    Output
    如果没有符合条件的组合,输出No Solution。
    如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。
    Input示例
    7
    -3
    -2
    -1
    0
    1
    2
    3
    Output示例
    -3 0 3
    -3 1 2
    -2 -1 3
    -2 0 2
    -1 0 1

    题目不错,可惜我有点傻,一开始准备暴力,结果写到一半发现行不通,于是转为二分,
    然而二分出现了一个很小的失误,然后连改了好几次,才发现.
     1 #include <bits/stdc++.h>
     2 #define N 1005
     3 using namespace std;
     4 int k[N],n;
     5 bool Find(int a){
     6   int begin=0,end=n-1;
     7   while(begin<=end){
     8     int mid=(begin+end)>>1;
     9     if(k[mid]>a){
    10       end=mid-1;
    11     }else if(k[mid]<a){
    12       begin=mid+1;
    13     }else{
    14       return true;
    15     }
    16   }
    17   return false;
    18 }
    19 int main(){
    20   scanf("%d",&n);
    21   for(int i=0;i<n;i++){
    22     scanf("%d",&k[i]);
    23   }
    24   sort(k,k+n);
    25   bool prime=true;
    26   for(int i=0;i<n;i++)
    27     for(int j=i+1;j<n;j++){
    28       int ans=-(k[i]+k[j]);
    29       if(ans<=k[j])
    30           break;
    31       if(Find(ans)){
    32         prime=false;
    33         printf("%d %d %d
    ",k[i],k[j],ans);
    34       }
    35     }
    36   if(prime)
    37     printf("No Solution
    ");
    38   return 0;
    39 }
  • 相关阅读:
    bzoj 2730: [HNOI2012]矿场搭建
    bzoj 1179: [Apio2009]Atm
    strcpy,strlen, strcat, strcmp函数,strlen函数和sizeof的区别
    C语言printf的格式
    C语言中交换两个数值的方法
    C语言中 指针的基础知识总结, 指针数组的理解
    自定义方法实现strcpy,strlen, strcat, strcmp函数,了解及实现原理
    选择排序
    冒泡排序的优化
    storyBoard中取消键盘第一响应
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/7372130.html
Copyright © 2020-2023  润新知