码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-15 21:02:25      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:const   https   不能   span   href   直接   inf   inline   暴力   

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

const int maxn = 1e6+10;
struct INFO {
    int a, b;
    ll sum;
    void add(int x, int y, ll z) {
        a = x, b = y, sum = z;
    }
} info[maxn];
ll arr[maxn]; int kase;
int main(void) {
    int n;
    scanf("%d", &n);
    for (int i = 0; i<n; ++i) scanf("%lld", &arr[i]);
    for (int i = 0; i<n-1; ++i)
        for (int j = i+1; j<n; ++j) 
            info[kase++].add(i, j, arr[i]+arr[j]);
    sort(info, info+kase, [](INFO x, INFO y){
        return x.sum < y.sum;
    });
    int l = 0, r = kase-1;
    while(l<r) {
        if (info[l].sum+info[r].sum == 0 && info[l].a!=info[r].a && info[l].a!=info[r].b && info[l].b!=info[r].a && info[l].b!=info[r].b) {
            printf("Yes\n");
            return 0;
        } 
        else if (info[l].sum+info[r].sum<0) ++l;
        else --r;
    }
    printf("No\n");
    return 0;

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

标签:const   https   不能   span   href   直接   inf   inline   暴力   

原文地址:https://www.cnblogs.com/shuitiangong/p/12708270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!