Codeforces Round #486 (Div. 3) C.Equal Sums

题目链接http://codeforces.com/contest/988/problem/C

题目分析:

给你k个 数字序列 再给出他们每个序列的长度和具体的值

找出两个序列,各删除一个数后,序列和相等,问删除哪两个序列的哪两个数 

题目建模:

简单来说,就是暴力预处理出删除每个数后的序列和,map存一下,然后不断找这个这些值有没有出现

#include<bits/stdc++.h>
using namespace std;
map<int,pair<int,int> >mp;

int a[2000005];
int t,n,sum,flag;

int main()
{

    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        scanf("%d",&n);
        sum=0;
        for(int j=1; j<=n; j++)
        {
            scanf("%d",&a[j]);
            sum+=a[j];    //数列求和
        }
        flag=0;
        for(int j=1; j<=n; j++)
        {
            if(mp.count(sum-a[j])&&flag==0)    //用count计数,检查是否出现过
            {
                flag=1;
                printf("YES\n");
                printf("%d %d\n",mp[sum-a[j]].first,mp[sum-a[j]].second); 
                 //first second 代表 map<int,pair<int,int> >mp; 中的两个值
                printf("%d %d\n",i,j);
            }
        }
        if(flag)
        {
            return 0;
            break;
        }

        for(int j=1; j<=n; j++)
        {
            mp[sum-a[j]]= {i,j};//用和减去每一项的值,全都记录在map中
        }
    }
    if(!flag) puts("NO");
}

猜你喜欢

转载自blog.csdn.net/AC_Meiko/article/details/81460852