Codeforces (c) Copyright 2010-2018 Mike Mirzayanov
The only programming contests Web 2.0 platform
Server time: Jun/06/2018 14:18:58
UTC+8 (d3).
Desktop version, switch to
mobile version.
题目大意:给定t组数据,每组数据有n个,问能否找到两组数据,是两组数据个删除掉一个数并且两组数据的和相等,如果有则找出两组数据是第几组,并且删除的数据在改组数据中的位置。
题目上反映的一一对应关系说明要用到map,然后就接着道题学了一下map的基本用法,后来看大牛的博客发现还可以用map和pair的组合,就有些了一遍。附上两种写法,以及运行时间。
第一种写法:
38984137 | 2018-06-06 08:26:06 | d-xiang-ha | C - Equal Sums | GNU C++17 | Accepted | 327 ms | 16600 KB |
#include<bits/stdc++.h>
using namespace std;
map<int,int> ma1;//用来记录数据的组数
map<int,int> ma2;//用来记录数据的位数
int a[1000010];
int main(){
int t,r1,r2,r3,r4;
cin>>t;
bool flag=false;
for(int i=1;i<=t;i++){
int n;
cin>>n;
int sum=0;
if(flag) continue;
for(int j=1;j<=n;j++){
cin>>a[j];
sum=sum+a[j];
}
for(int j=1;j<=n;j++){
map<int,int>::iterator ite=ma1.find(sum-a[j]);
if(ite!=ma1.end()){
if(ma1[sum-a[j]]!=i){
r1=ma1[sum-a[j]];
r2=ma2[sum-a[j]];
r3=i;
r4=j;
flag=true;
break;
}
}
else{
ma1[sum-a[j]]=i;
ma2[sum-a[j]]=j;
}
}
}
if(!flag) cout<<"NO"<<endl;
else{
cout<<"YES"<<endl;
cout<<r1<<" "<<r2<<endl;
cout<<r3<<" "<<r4<<endl;
}
return 0;
}第二种写法:
38985054 | 2018-06-06 09:17:59 | d-xiang-ha | C - Equal Sums | GNU C++17 | Accepted | 296 ms | 11900 KB |
#include<bits/stdc++.h>
using namespace std;
map<int,pair<int,int> > ma;
int a[1000010];
int main(){
int t;
cin>>t;
for(int i=1;i<=t;i++){
int n;
cin>>n;
int sum=0;
for(int j=1;j<=n;j++){
cin>>a[j];
sum=sum+a[j];
}
for(int j=1;j<=n;j++){
if(ma.count(sum-a[j])){
cout<<"YES"<<endl;
cout<<ma[sum-a[j]].first<<" "<<ma[sum-a[j]].second<<endl;
cout<<i<<" "<<j<<endl;
return 0;
}
}
for(int j=1;j<=n;j++){
ma[sum-a[j]]={i,j};
}
}
cout<<"NO"<<endl;
return 0;
}