zoukankan      html  css  js  c++  java
  • XidianOJ 1030 三数和

    题目描述

    北雷老中医给出大面包一个长度为N的无序数组,数组中的元素为整数。如果大面包从中找出一个和 = 0的3个数的组合颜值就能+1。如果没有这样的组合,输出Ren Chou Jiu Gai Duo Du Shu!。

    由于大面包希望他的颜值最高,他需要求出所有和=0的3个数的组合,并把它们按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。大面包想变得和主席亮一样帅,请大家帮忙。

    保证输入的数组不包含重复元素。

    输入

    多组数据 

    对于每组数据:

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

    输出

    如果没有符合条件的组合,输出Ren Chou Jiu Gai Duo Du Shu!。
    如果有多个组合,需要全部输出。顺序按照3个数中最小的数从小到大排列,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列
    --正文
    排序后枚举前两个数,使用lowerbound二分查找第三个数
    (PS:STL确实省事)
     
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    int a[1005],n;
    
    int main(){
        while (scanf("%d",&n) != EOF){
            int i,j;
            for (i=0;i<n;i++){
                scanf("%d",&a[i]);
            }
            sort(a,a+n);
            int has = 0;
            for (i=0;i<n-2;i++){
                for (j=i+1;j<n-1;j++){
                    int sum = a[i]+a[j];
                    int pos = lower_bound(a+j+1,a+n,-sum) - a;
                    //printf("%d %d %d
    ",sum,pos,a[pos]);
                    if (pos < n && a[pos] == -sum){
                        has = 1;
                        printf("%d %d %d
    ",a[i],a[j],a[pos]);
                    }
                }
            }
            if (!has) printf("Ren Chou Jiu Gai Duo Du Shu!
    ");
        }
        return 0;
    }
  • 相关阅读:
    课后作业
    课后作业
    课后作业3
    课后作业
    课后作业
    课后作业
    java 加减法2
    java 出计算题
    Java web 登录界面
    构建之法读后感
  • 原文地址:https://www.cnblogs.com/ToTOrz/p/6068718.html
Copyright © 2011-2022 走看看