小鸡吃米
时间限制:1秒 内存限制:128M
小鸡的吃饭时间到了,但是码农场主想要锻炼小鸡的思维力,给小鸡提出了要求,码农场主给出了n堆大米,记做1~n,每堆米要么是一粒大米要么是两粒大米,让小鸡来摆这n堆大米的位置,摆放好后,当从第一堆开始到某一位置的所有大米的数目的和是一个质数的时候,码农场主就会给小鸡一个奖励,小鸡想要最多的奖励,所以他应该怎么摆放这n堆大米,才能拿到最多的奖励。
第一行,一个数n,表示码农场主给出了n堆大米。
第二行,输入n个数,表示每一堆大米的数量,大米的数量要么是1 要么是2。
一个数ans,小鸡最多能拿到多少奖励
5
1 2 1 2 1
4
9
1 1 2 1 1 1 2 1 1
5
20%的数据:1≤n≤100
100%的数据 1≤n≤200000
讲解
因为每堆小米是一粒或两粒,
除了二这个质数以外,
其他质数都可以拆成一个偶数+1
所以只要没有一,
就只能领一次奖励。
不然的话,
就是1到总米数之间的质数个数为奖励次数
AC代码如下
#include<cstdio>
bool a[1000000];
int n,o,t,b,cnt,prime[1000000];
int main(){
scanf("%d",&n);
for(int i=2;i<=800000;i++){
if(!a[i])
prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&i*prime[j]<=800000;j++) {
a[i*prime[j]]=1;
if(i%prime[j]==0){
break;
}
}
}
for(int i=1;i<=n;i++){
scanf("%d",&b);
if(b==1)
o++;
else if(b==2)
t++;
}
cnt=0;
if(o==0){
puts("1");
return 0;
}
for(int i=2;i<=o+t+t;i++)
if(!a[i])
cnt++;
printf("%d",cnt);
return 0;
}