北邮新生排位赛10解题报告
488. 小妹妹个数
时间限制 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; }B. 田田背课文 2014新生暑假个人排位赛11
时间限制 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; }C. 小妹妹采蘑菇 2014新生暑假个人排位赛11
时间限制 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; }E. 小妹妹去划船 2014新生暑假个人排位赛11
时间限制 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;
}