2017-02-23

内容:上周六考试第三题题解。
第三题(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值