内容:上周六考试第三题题解。
第三题(Half):
至今未明白问题:
1.不用以下代码仍可以过,那么这两行出现在题解上有什么用呢?
srand(time(0));
random_shuffle(a+1,a+n+1);
1.srand(time(0));
这是用于初始化随机函数发生器的,计算机中的随机函数在生成一个随机数时需要用到一个称为随机数发生器的东西,如果不对其进行初始化,每次生成的随机数就会是相同的。
srand函数就用来初始化这个发生器,参数time(0)能够生成从1970年1月1日到当前机器时间的秒数,这个数在你每次执行程序的时候都会不断增长、变化,所以用它当做种子来初始化发生器,就会生成不同的随机数了。
种子只要不同,就可以保证每次生成的数字不同,而生成数字的范围取决于以下公式:
(double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;
可以生成[range_min, range_max)区间中的随机数。
http://www.cnblogs.com/xiaoxiaoxin-love-ping/p/3528849.html
2.STL(模板库)
STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。
STL中的函数random_shuffle()用来对一个元素序列进行重新排序(随机的)
http://blog.csdn.net/vivi_wang_11/article/details/7441803#
3.map函数使用
http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html
OJ927
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iomanip>
#include<iostream>
#include<cctype>
#include<map>
#define N 1000001
using namespace std;
int n,cnt,num;
long long a[N],c[N],v[N],f[N];
map<long long,int> events;
long long gcd(long long a,long long b){
if(!b)
return a;
return
gcd(b,a%b);
}
int find(int n,long long aim){
if(v[n]==aim)
return n;
int left=0,right=n,mid=(left+right)>>1;
for(;left+1<right;mid=(left+right)>>1)
if(v[mid]<aim)
left=mid;
else
right=mid;
return
right;
}
int main(){
//freopen("half.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
srand(time(0));
random_shuffle(a+1,a+n+1);
long long ans=0;
for(int i=1;i<=n&&i<=10;i++){
cnt=0;
num=0;
sort(c+1,c+cnt+1);
for(long long j=1;j*j<=a[i];j++)
if((a[i]%j)==0){
num++;
v[num]=j;
f[num]=0;
if(j*j!=a[i]){
num++;
v[num]=a[i]/j;
f[num]=0;
}
}
sort(v+1,v+num+1);
for(int j=1;j<=n;j++)
f[find(num,gcd(a[i],a[j]))]++;
for(int j=1;j<=num;j++){
long long tot=0;
if(v[j]<=ans)
continue;
for(int k=j;k<=num;k++)
if((v[k]%v[j])==0)
tot=tot+f[k];
if(tot*2>=n)
ans=max(ans,v[j]);
}
}
printf("%I64d",ans);
return 0;
}