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

探讨了在给定整数数组中寻找三个数使它们的和为零的问题,提供了详细的算法实现,包括输入输出格式及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#include <bits/stdc++.h>
#define LL long long
using 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
-1
1
-5
2
4
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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值