• CF988 C. Equal Sums【map+pair/hash/任选两个序列,两个序列都除去他们中的一个数,使的总和相同】


    【链接】:CF988C
    【题意】:在n个序列中任选两个序列,两个序列都除去他们中的一个数,使的总和相同
    【分析】:map<int,pair<int,int> > mp,从0~m遍历删除第i个数,mp[sum-a[i]]={j+1,i+1}; 其中key是记录删掉某个数的剩下的数,value是一对以行列号用来确定位置以方便输出。若删掉某个数剩下的数与之前的某个数相等,则马上输出并退出。时间复杂度O(n*m)
    【代码】:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2*1e5+5;
    
    int n,m,a[N];
    map<int,pair<int,int> > mp;
    
    int main()
    {
        int n;
        int m;
    
        scanf("%d",&n);
        for(int j=0;j<n;j++)
        {
            scanf("%d",&m);
            int sum=0;
            for(int i=0;i<m;i++)
            {
                scanf("%d",&a[i]);
                sum+=a[i];
            }
            //cout<<"sum = "<<sum<<endl;
            for(int i=0;i<m;i++)
            {
                //cout<<"sum-a["<<i+1<<"] = "<<sum-a[i]<<endl;
                if(mp.count(sum-a[i]))
                {
                    cout<<"YES"<<endl<<mp[sum-a[i]].first<<' '<<mp[sum-a[i]].second<<endl<<j+1<<' '<<i+1<<endl;
                    return 0;
                }
            }
            for(int i=0;i<m;i++)
            {
                mp[sum-a[i]]={j+1,i+1};
                //cout<<"mp["<<sum-a[i]<<"]:"<<"j="<<j+1<<' '<<"i="<<i+1<<endl;
            }
    
        }
        cout<<"NO"<<endl;
    }
    /*
    2
    5
    2 3 1 3 2
    sum = 11
    sum-a[1] = 9
    sum-a[2] = 8
    sum-a[3] = 10
    sum-a[4] = 8
    sum-a[5] = 9
    mp[9]:j=1 i=1
    mp[8]:j=1 i=2
    mp[10]:j=1 i=3
    mp[8]:j=1 i=4
    mp[9]:j=1 i=5
    6
    1 1 2 2 2 1
    sum = 9
    sum-a[1] = 8
    YES
    1 4
    2 1
    */
    
  • 相关阅读:
    快速幂
    Oracle悲观锁和乐观锁
    UTL_RAW的问题?
    Linux操作系统下关于Top命令的参数详解
    存储过程与函数
    网站前端优化一些小经验
    Java获取各种常用时间方法2
    Pro CSS Techniques 读书笔记(六)
    Java获取各种常用时间方法
    Oracle专用服务器与共享服务器的区别
  • 原文地址:https://www.cnblogs.com/Roni-i/p/9129881.html
Copyright © 2020-2023  润新知