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; }