题目链接: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");
}