2019年1月20日训练日记

对于昨天的位运算,解决了今天的一个题:
一个奇数次:
输入一个长度为n的数组,考虑所有不同的数字,有且只有一个数字出现了奇数次。比如对于1 2 3 1 2 3 1,我们考虑所有不同的数字1 2 3,有且只有1出现了奇数次(3次)输出这个出现了奇数次的数字。1 <= n <= 100000 1 <= a[i] <= 10^9
(用异或运算解决,将所有输入的数据异或(可以通过对零异或保留初值)这样就得到唯一一个出现奇数次的数据了)
但是对于两个奇数次或多个奇数次用异或我就无从下手了。。。
于是换了另一种做法,代码如下:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
long long int a[100001];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            if(a[i]==a[j]&&i!=j)
            {
                a[i]=0;
                a[j]=0;
            }
    }
    sort(a+1,a+n);
    cout<<a[n-1]<<" "<<a[n];
	return 0;
}

但是对于下列测试数据得不到结论,大概是越界了,于是定义数组时换成了long long int,但是还是不能测出,其一组测试数据如下:
10
470151588
233455503
826112663
223502930
233455503
271743491
826112663
470151588
470131517
271743491
通过这组数据发现测试数据时还真是相当暴力,都这么大。这个题还要再想想才行。
看到底是越界问题还是代码问题。

另外还从别的csdn上看到一些有关生成随机数的概念,写的比较详细,现在写到下面:生成随机数
(1)随机函数rand()是在头文件cstdlib中
(2)利用求余函数rand()%b将函数rand()生成的随机数变化到[0,b-1]之间
(3)利用rand()%b+a将随机数的取值范围平移到[a,a+b-1]之间
例:#include
int magic;
magic=rand()%100+1; //生成一个1-100之间的随机数,但这种方法只能生成固定的随机数,于是我们提出了随机数种子
例:#include<time.h>
#include
int magic;
srand(time(NULL)); //为函数rand()设置随机数种子
magic=rand()%100+1;

猜你喜欢

转载自blog.csdn.net/qq_42785226/article/details/86561542
今日推荐