题干:
寻找唯一的萌妹
Description
又到了一年一度ACMer暑期留校集训的日子了,目前一共有2n+1个小萌新报名参加暑期集训,其中2n个是帅哥,只有1个萌妹子,这是多么的悲催!由于暑期训练强度大,坚持下来可不是一件容易的事情,DHG学长想到了一个巧妙的方法,两个人组成一队,两人互相鼓励,互相监督,直到集训顺利完成。然而,只有具有相同抗压能力的两位同学才能组在一起,并且这个唯一的萌妹子比较高傲不愿意和现有的2n个帅哥组队,只想和下一个报名的同学组队。作为仍未报名的你,想和这传说中的萌妹子组队,要求你输出萌妹子的抗压能力值。
Input
第一行一个n(n<=1000000)
第二行2n+1个数,表示每个小萌新的抗压能力值xi(-99999999<xi<99999999)。
Output
只输出一个数字,表示萌妹的抗压能力值。
Sample Input 1
2
1 2 2 1 3
Sample Output 1
3
Sample Input 2
1
-2 -2 1
Sample Output 2
1
Hint
题目保证:有正确答案;
解题报告:
这是集训队纳新的一道题目,比赛时是用map做的。超时了。
其实用map也是可以的但是要用迭代器遍历或者mp[ a[i] ]这样遍历,而不能从-99999999~~+99999999这样遍历,这不是作死吗。
TLE代码:(1040ms)
#include<iostream>
#include<map>
#include<list>
#include<algorithm>
using namespace std;
list<int> lili;
bool cmp(const int & a,const int & b ) {
return a<b;
}
map<int,int> mp;
int main()
{
int n;
int tmp;
scanf("%d",&n);
n=n*2+1;
for(int i = 1; i<=n; i++) {
scanf("%d",&tmp);
if(mp[tmp]==1) {
list<int> :: iterator it;
for(it=lili.begin();it!=lili.end(); it++ ) {
if(*it==tmp) break;
}
lili.erase(it);
mp[tmp]=0;
}
else {
mp[tmp]=1;
lili.push_back(tmp);
}
}
cout << lili.front() << endl;
return 0;
}
TLE代码2:(1272ms)
#include<iostream>
#include<map>
#include<list>
#include<algorithm>
using namespace std;
list<int> lili;
bool cmp(const int & a,const int & b ) {
return a<b;
}
map<int,int> mp;
int main()
{
int n;
int tmp;
scanf("%d",&n);
n=n*2+1;
for(int i = 1; i<=n; i++) {
scanf("%d",&tmp);
if(mp[tmp]==1) {
mp.erase(tmp);
}
else {
mp[tmp]=1;
}
}
map<int,int> :: iterator it;
for(it=mp.begin();it!=mp.end();it++) {
printf("%d\n",*it);
}
return 0;
}
wa代码:(1376ms)
#include<iostream>
#include<map>
using namespace std;
//int a[100000000];
map<int,int> mp;
int main()
{
int n;
int tmp;
scanf("%d",&n);
n=n*2+1;
for(int i = 1; i<=n; i++) {
scanf("%d",&tmp);
mp[tmp]++;
}
for(int i = 1; i<=n; i++) {
if(mp[i]&1) {
printf("%d\n",i);
break;
}
}
return 0 ;
}
//2
//1 2 2 1 3
ac代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[2000005];
int main()
{
int n;
scanf("%d",&n);
n=n*2+1;
for(int i = 1; i<=n; i++) {
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int cnt=1;
int tmp=a[1];
for(int i = 2; i<=n; i++) {
if(tmp==a[i]) {
cnt++;
}
else {
if(cnt&1) {
printf("%d",a[i-1]);
return 0 ;
}
else {
tmp=a[i];
cnt=1;
}
}
}
printf("%d",a[n]);
//if(a[i]==a[i-1]) {
// cnt++;
// continue;
// }
// if( (cnt&1) ) {
// printf("%d",a[i]);
// return 0;
// }
// cnt=1;
// printf("$dddd");
return 0 ;
}
总结:
1.首先注意数组别开小 开一个1e6肯定上来就玩完了直接RE告辞。得开2e6啊这题!
2.容器这东西,,,很难说啊