zoukankan      html  css  js  c++  java
  • 51Nod

    题目链接
      这题(nleq 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
    ");
                return 0;
            } 
            else if (info[l].sum+info[r].sum<0) ++l;
            else --r;
        }
        printf("No
    ");
        return 0;
    
  • 相关阅读:
    冲刺第二阶段第十天
    冲刺第二阶段第九天
    冲刺第二阶段第八天
    冲刺第二阶段第七天
    第十三周学习进度条
    冲刺第二阶段第六天
    第二冲刺阶段绩效评估
    Beta版总结会议
    Alpha版总结会议
    第二次冲刺阶段站立会议(十)
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/12708270.html
Copyright © 2011-2022 走看看