程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 51nod 1090 3個數和為0 & 51nod 1267 4個數和為0(標記二分)

51nod 1090 3個數和為0 & 51nod 1267 4個數和為0(標記二分)

編輯:C++入門知識

51nod 1090 3個數和為0 & 51nod 1267 4個數和為0(標記二分)


題目意思:

3個數的和為0:

 

給出一個長度為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

題目分析:

此題可以二分,首先計算任意兩個數的和存到數組b中,進行排序a(原數組)和b數組,進行判斷a[i=0]+b[j=(n*(n-1))]=0?,如果三個數兩兩不等且等於0,則存到結果數組,(保證輸出時結果不重復),最後輸出結果集。詳見代碼,寫的有點亂,望見諒!

 

AC代碼:

#include
#include
#include
#define MAX 1001
using namespace std;
int a[MAX],b[3];
struct node{
    int si,sj;
}s[MAX*(MAX-1)];

struct Snode{
    int si,sj,sk;
}p[MAX*(MAX+5)];

int cmp1(node a,node b){
    if(a.si+a.sj<=b.si+b.sj) return 1;
    return 0;
}

int cmp2(Snode a,Snode b){
    if(a.si>n){
        int k=0;
        for(int i=0;i>a[i];
            for(int j=0;j=0){
            if(s[j].si+s[j].sj+a[i]==0){
                if(a[i]!=s[j].si&&a[i]!=s[j].sj){
                    ok=0;
                    b[0]=a[i]; b[1]=s[j].si; b[2]=s[j].sj;
                    sort(b,b+3);
                    p[kk].si=b[0];
                    p[kk].sj=b[1];
                    p[kk++].sk=b[2];
                }
                j--;
            }
            else if(s[j].si+s[j].sj+a[i]<0){
                i++;
            }
            else if(s[j].si+s[j].sj+a[i]>0){
                j--;
            }
        }
        //cout<

四個數的和是否為0

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=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

題目分析:
本題和三個數的和為0,算法一樣,只是這裡數組b和自己求和是否為0,比較是否用兩兩相等的時候,需要比較下標,只要相加是將兩個數的下標對應存起來即可。

 

AC代碼:

/**
 *序列中可能有重復的數
 *首先兩個數相加為一個序列,再用這個序列和和本序列相加是否等於0
 *判斷是注意比較是否四個數是否相等,由於可能有重復的數,只能用
 *位置判斷,及記錄兩個數的位置下標進行比較,
 *記過等於0且不相等YES,否則NO
 */
#include
#include
#include
#define MAX 1001
using namespace std;
int a[MAX];
struct node{
    int i,j;
    int sum;
}s[MAX*(MAX-1)];

int cmp1(node a,node b){
    if(a.sum<=b.sum) return 1;
    return 0;
}

int main()
{
    int n;
    while(cin>>n){
        int k=0;
        for(int i=0;i>a[i];
            for(int j=0;j0){
                j--;
            }
        }
        if(ok) cout<


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved