P1469 找筷子(map容器,异或运算)C++

在这里插入图片描述
在这里插入图片描述

用map挺简单,但是空间有点超限:

#include<iostream>
#include<cstdio>
#include<map>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
int main()
{
    
    
	//cout << fixed << setprecision(0);
	//cout << setw(8) << setiosflags(ios::left);
	map<int,int> mp ;
	int n;
	llu a;
	cin >> n ;
	
	for(int i=0;i<n;i++)
	{
    
    
		cin >> a ;
		mp[a]++;
	}
	map<int,int>::iterator it;
	for(it=mp.begin();it!=mp.end();it++)
	{
    
    
		if(it->second%2==1){
    
    
			cout << it->first << endl ;
			break;
		}
	}
	return 0;
}

尝试直接开数组暴力遍历,依然内存超限:

#include<iostream>
#include<cstdio>
#include<map>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
int main()
{
    
    
	//cout << fixed << setprecision(0);
	//cout << setw(8) << setiosflags(ios::left);
	int n;
	cin >> n ;
	int a[n+5]={
    
    0};
	for(int i=0;i<n;i++)
	{
    
    
		cin >> a[i] ;
	}
	sort(a,a+n);
	//一次跳两个,如果当前位置和下一个位置长度不一样,证明是奇数个这种长度的筷子 
	for(int i=0;i<n;i+=2){
    
    
        if(a[i]!=a[i+1]){
    
    
            cout<<a[i];
            return 0;
        }
    }
	
	return 0;
}

没办法了,查到了异或的知识,偶数个相同的数异或的结果为0,那就把所有输入都异或一遍,剩的就剩那个落单的:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
	//cout << fixed << setprecision(0);
	//cout << setw(8) << setiosflags(ios::left);
	int n,a,ans=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
    
    
		scanf("%d",&a);
		ans^=a;
	}
	printf("%d\n",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wangyurenwls/article/details/118554151