51NOD 1090 三个数和为0 1267 4个数和为0 二分答案

来源:互联网 发布:洛奇英雄传mac 编辑:程序博客网 时间:2024/06/05 10:26
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-10123
Output示例
-3 0 3-3 1 2-2 -1 3-2 0 2-1 0 1

#include <bits/stdc++.h>#define LL long longusing namespace std;const int AX = 1e4+6;int n;struct  Node{int x;int y;LL sum;}e[AX];int a[AX];bool cmp( const Node &a , const Node &b ){return a.sum < b.sum;}bool check( int x ){int l = 0 , r = n-1;while( l <= r ){int mid = ( l + r ) >> 1;if( a[mid] < x ) l = mid + 1;else if( a[mid] > x ) r = mid - 1;else return 1;}return 0;}int main(){ios_base::sync_with_stdio(false);cin.tie(0);cin>>n;for( int i = 0 ; i < n ; i++ ){cin>>a[i];}int tot = 0;sort(a,a+n);int flag  =  0;for( int i = 0 ; i < n ; i++ ){for( int j = i + 1 ; j < n ; j ++ ){int temp = -a[i]-a[j];if( temp <= a[j] ) break;if( check(temp) ){flag = 1;cout<<a[i]<<' '<<a[j]<<' '<<temp<<endl;}}}if( !flag ) cout<<"No Solution"<<endl;return 0;}


相比之下,觉着还是下面求4个数的简单。。因为不用输出。。


1267 4个数和为0

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注
给出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-11-524
Output示例
Yes
#include <iostream>#include <stdio.h>#include <algorithm>#include <cstring>using namespace std;int N;int a[2000];struct Node{int x;int y;long long  sum;}site[1000100];bool cmp(const Node &a,const Node &b){return a.sum<b.sum;}int main(){memset(site,0,sizeof(site));int cnt = 0;int ans = 0;scanf("%d",&N);while(N--){scanf("%d",&a[cnt++]);}for(int i=0;i<cnt;i++){for(int j=i+1;j<cnt;j++){site[ans].sum = a[i]+a[j];site[ans].x = i;site[ans].y = j;ans++;}}sort(site,site+ans,cmp);int i=0,j=ans-1;while(i<j){        long long l = site[i].sum+site[j].sum;if(l==0&&site[i].x!=site[j].x&&site[i].x!=site[j].y&&site[i].y!=site[j].y&&site[i].y!=site[j].x){cout<<"Yes"<<endl;return 0;}else if((site[i].sum+site[j].sum)<0) {      i++;      }else {j--;}}cout<<"No"<<endl;return 0;}