51nod 1267 二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267

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将所有两个不同的数的和以及下标封入一个结构体里,然后按照和排序后循环对每一个和二分查找他的相反数的下标,找到一段待匹配的数据,只要相加为零且四个下标相互不冲突即表示可以。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<set>
 6 #include<ctime>
 7 #include<functional>
 8 #include<algorithm>
 9 using namespace std;
10 #define LL long long
11 int A[1005];
12 struct node
13 {
14     LL w;
15     int  a, b;
16     node() {};
17     node(LL s, int a, int b):w(s), a(a), b(b) {};
18     bool operator<(const node& tmp)const {
19         return w < tmp.w;
20     }
21 }P[1000005];
22 int main()
23 {
24     int N, i, j, k,p=0;
25     cin >> N;
26     for (i = 1;i <= N;++i)
27     {
28         scanf("%d", &A[i]);
29         for (j = 1;j < i;++j)
30         {
31             p++;
32             P[p].w = (LL)A[i] + A[j];
33             P[p].a = j;
34             P[p].b = i;
35         }
36     }
37     P[p + 1].w = 1e18;
38     bool ok = 0;
39     sort(P + 1, P + 1 + p);
40     for (i = 1;i <= p;++i)
41     {
42         int k = lower_bound(P+1,P+2+p,node(-P[i].w,0,0))-P;
43         if (P[k].w != -P[i].w) continue;
44         for (j = k;P[j].w == -P[i].w&&j <= p;j++) {
45             if (P[i].a!=P[j].a&&P[i].a!=P[j].b&&P[i].b!=P[j].a&&P[i].b!=P[j].b) { ok = 1;break; }
46         }
47         if (ok)break;
48     }
49     ok ? puts("Yes") : puts("No");
50     //system("pause");
51     return 0;
52 }
时间: 2024-12-16 05:03:35

51nod 1267 二分的相关文章

51nod 1267二分+优化试验场

最初,最开始的时候,万能的学姐曾经警告过我们,千万别用什么老狮子MAP,手撸map或者字典树...当时不甚理解...今天...这题直接卡掉了我的MAP,但是使用朴素方法进行二分...不加优化,,都不需要这个架势...直接相差了将近十倍,在我开了优化之后快了20倍左右.... 上代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const long long MAXN=1233; 5 6 7 class node 8 { 9 pub

51nod 1090 3个数和为0 &amp; 51nod 1267 4个数和为0(标记二分)

题目意思: 3个数的和为0: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序. Input 第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 -

[51nod] 1267 4个数和为0 暴力+二分

给出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

51nod 1243 二分+贪心

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 1243 排船的问题 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个码头中有N艘船和N个木桩,船的长度为2*X,码头的宽度为M,N个木桩的位置(相对码头左岸的位置)会在数据中给出.船和船之间不能重叠,即每艘船的船头不能超过上一艘船的船尾,当然也不能超出码头的两岸.船和木桩之间用绳子

51nod 1128 二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1128 1128 正整数分组 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 给出一个长度为N的正整数数组,不改变数组元素的顺序,将这N个数分为K组.各组中元素的和分别为S1,S2....Sk.如何分组,使得S1至Sk中的最大值最小? 例如:1 2 3 4 5 6分为3组,{1 2 3} {4 5} {6},元素和为6

51nod 1105 二分好题

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ......A[1] * B[0],A[1] * B[1]......A[n - 1] * B[n - 1](数组A同数组B的组合).求

51nod 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",否则输出&q

51nod 平均数(二分+树状数组)

题目链接: 平均数 基准时间限制:4 秒 空间限制:131072 KB 分值: 80 LYK有一个长度为n的序列a. 他最近在研究平均数. 他甚至想知道所有区间的平均数,但是区间数目实在太多了. 为了方便起见,你只要告诉他所有区间(n*(n+1)/2个区间)中第k大的平均数就行了. Input 第一行两个数n,k(1<=n<=100000,1<=k<=n*(n+1)/2). 接下来一行n个数表示LYK的区间(1<=ai<=100000). Output 一行表示第k大的

51Nod - 1267 4个数和为0(暴力,思维)

题目链接 ??这题\(n\leq 1000\),首先我想的是直接枚举三个值然后二分找第\(4\)个数,但是显然复杂度肯定是不能接受的.那么只能继续降复杂度了...如果把这些数做一下预处理的话,可以\(n^2\)求出两个数一组的所有情况,然后分别从两头枚举,两数之和为0,肯定一个小一个大,我们将所有组合组成的数排序从两头枚举肯定能枚举出所有的情况,所以只要判定一下在枚举到中间以前能不能有一个答案符合要求就行了. const int maxn = 1e6+10; struct INFO { int