北邮新生排位赛10解题报告

时间限制 3000 ms 内存限制 65536 KB

题目描述

喜欢焦叔叔的小妹妹实在是太多了,以至于焦叔叔不得不给她们编号1-N。焦叔叔对于编号为质数的小妹妹有种特别的好感,由于有好感的小妹妹数目太多,焦叔叔自己都数不清楚了,请你来帮忙数一下。

输入格式

多组数据,每行一个正整数N,N不大于1000000000。

数据组数小于15。

输出格式

每行一个数字,有好感的小妹妹数。

输入样例

5

输出样例

3
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
bool isprime[10000];
int num[10000];
int num2[100000]={};//表里的数据放在这里
void calc(){
    isprime[0]=isprime[1]=true;
    for(int i=3;i<100;i+=2){
        if(!isprime[i]){
            for(int j=3*i;j<10000;j+=2*i){
                isprime[j]=true;
            }
        }
    }
    num[2]=1;
    for(int i=3;i<10000;i++){
        num[i]=num[i-1];
        if(i&1&&!isprime[i])num[i]++;
    }
}
bool judge(int n){
    if(n&1==0)return false;
    int r=sqrt(n+0.001);
    for(int i=3;i<=r;i+=2){
        if(n%i==0)return false;
    }
    return true;
}
int main(){
    int n;
    calc();
    while(scanf("%d",&n)==1){
        if(n<10000){printf("%d\n",num[n]);continue;}
        int t=n/10000;
        int ans=num2[t-1];
        for(int i=t*10000+1;i<=n;i+=2){
            if(judge(i))ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

时间限制 10000 ms 内存限制 65536 KB

题目描述

田田被老师要求背诵一个字符串,田田刚刚背了一个子串,说他记性差他还不承认,背下这个子串后却忘了这个子串是从哪里开始的。
现在田田把这个字符串给你,并且让你告诉他至少一次背多长的子串才不可能产生歧义,即不存在另一个子串与它相等

输入格式

输入仅一行,即要求田田背诵的字符串
长度<=10^6

输出格式

输出一行,即不产生歧义串的最小串长

输入样例

abcdabcd

输出样例

5

第一次使用后缀数组不完全版
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,k;
int rnk[1000005];
int sa[1000005];
int tmp[1000005];
char buff[1000005];//是时候换个字体了
bool cmp(int i,int j){
    if(rnk[i]!=rnk[j])return rnk[i]<rnk[j];
    int  ri=i+k<=n?rnk[i+k]:-1;
    int rj=j+k<=n?rnk[j+k]:-1;
    return ri<rj;
}
int calc(int s1,int s2){
    int i;
    for(i=0;s1+i<n&&s2+i<n;i++){
        if(buff[s1+i]!=buff[s2+i])break;
    }
    return i;
}
void getsa(){
    n=strlen(buff);
    for(int i=0;i<=n;i++){
        sa[i]=i;
        rnk[i]=i<n?buff[i]:-1;
    }
    for(k=1;k<=n;k*=2){
        sort(sa,sa+n+1,cmp);
        tmp[sa[0]]=0;
        for(int i=1;i<=n;i++){
            tmp[sa[i]]=tmp[sa[i-1]]+(cmp(sa[i-1],sa[i])?1:0);
        }
        for(int i=0;i<=n;i++){
            rnk[i]=tmp[i];
        }
    }
}
int contain(){
    int maxlen=0;
    for(int i=0;i<n;i++){
        maxlen=max(calc(sa[i],sa[i+1]),maxlen);
    }
    return maxlen;
}
int main(){
    scanf("%s",buff);
    getsa();
    int maxlen=contain();
    printf("%d\n",maxlen+1);
    return 0;
}
时间限制 1000 ms 内存限制 65536 KB

题目描述

在广茂的大森林里居住着一位可爱的小妹妹,以及一位怪叔叔。这天,怪叔叔让小妹妹为他做一锅蘑菇汤,可怜的小妹妹只好出门采集蘑菇。怪叔叔知道,森林里一共有n种不同的蘑菇,所以他提出了一个变态的要求,小妹妹必须为他做一锅包含所有n种蘑菇的汤。也就是说,小妹妹至少要采集齐所有的n种蘑菇。她想知道,平均要采多少朵蘑菇能满足怪叔叔的要求,注意,她每次所采的蘑菇是等概率的。

输入格式

多组case,case<=100。每组case一行一个数n,1<=n<=100。输入以EOF结束。

输出格式

每组case输出一行答案,保留六位小数。

输入样例

1
2

输出样例

1.000000
3.000000

关键就在平均采多少,这时候就相信概率论吧 已有k种增一种就是n/n-k,不能具体到状态那样就不用算了,直接弃疗吧
#include <cstdio>
using namespace std;
int main(){
    int n;
    while(scanf("%d",&n)==1){
        double ans=0.0;
        for(int i=1;i<=n;i++){
            ans+=(double)n/(double )i;
        }
        printf("%.6lf\n",ans);
    }
    return 0;
}

时间限制 1000 ms 内存限制 65536 KB

题目描述

小妹妹和叔叔来到了小明湖畔划船,到了湖中间的时候,叔叔突然手一抖就把桨掉到了水里。叔叔对小妹妹说:“怎么办呀我们没办法划船了,我们是不是就只能这样子一直两个人呆在湖中央了呢~?”。 机智的小妹妹想了一会儿,她说:“我发现,靠风来吹我们的船也是可以动的哟~你说风什么时候能把我们吹回码头?” 这下次可难倒叔叔了,请你帮助他解决这个问题好不让小妹妹失望。 叔叔的船现在在sx,sy位置,而码头在ex,ey位置。 我们假设风只向东(E)南(S)西(W)北(N)四个方向吹,且每吹一次风: 东风将船向x+1,y方向吹; 南风将船向x,y-1方向吹; 西风将船向x-1,y方向吹; 北风将船向x,y+1方向吹。 请问叔叔和小妹妹最早什么时间回到码头?注意,小妹妹的船是有锚的~她不希望船动的话叔叔就在第一时间把锚抛下去。

输入格式

输入包含多组数据。每组输入第一行包含五个整数,t,sx,sy,ex,ey,第二行包含t个字符,仅含'E','S','W','N'。

坐标绝对值小于1000000000。t<=100000。输入保证起点重、终点坐标不相同。

输出格式

输出一个t表示最早到达码头的时间,如果到达不了则输出-1。

输入样例

5 0 0 1 1
SESNW

输出样例

4
连模拟题也算不上。不过我也没怎么认真写
#include <cstdio>
#include <cctype>
using namespace std;
int fw[100001],fs[100001],fn[100001],fe[100001];
int t,sx,sy,ex,ey;
int nw,ns,nn,ne;
int main(){
    while(scanf("%d%d%d%d%d",&t,&sx,&sy,&ex,&ey)==5){
        char ch=0;
        nw=ns=nn=ne=0;
        while(t>0&&!isalnum(ch))ch=getchar();
        for(int i=1;i<=t;i++){
            switch(ch){
            case 'S':
                fs[ns++]=i;
                break;
            case 'E':
                fe[ne++]=i;
                break;
            case 'N':
                fn[nn++]=i;
                break;
            case 'W':
                fw[nw++]=i;
                break;
            }
            if(i!=t)ch=getchar();
        }
        int gapx=ex-sx,gapy=ey-sy;
        int ans=0;
        if(gapx<0){
            if(-gapx>nw)ans=-1;
            else ans=fw[-gapx-1];
        }
        else if(gapx>0){
            if(gapx>ne)ans=-1;
            else ans=fe[gapx-1];
        }
        if(ans!=-1){
            if(gapy<0){
                if(-gapy>ns)ans=-1;
                else ans=fs[-gapy-1];
            }
            else if(gapy>0){
                if(gapy>nn)ans=-1;
                else ans=fn[gapy-1];
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
posted @ 2014-08-07 15:51  雪溯  阅读(240)  评论(0编辑  收藏  举报