小鸡吃米(思考题)

小鸡吃米

时间限制:1秒        内存限制:128M

题目描述:

小鸡的吃饭时间到了,但是码农场主想要锻炼小鸡的思维力,给小鸡提出了要求,码农场主给出了n堆大米,记做1~n,每堆米要么是一粒大米要么是两粒大米,让小鸡来摆这n堆大米的位置,摆放好后,当从第一堆开始到某一位置的所有大米的数目的和是一个质数的时候,码农场主就会给小鸡一个奖励,小鸡想要最多的奖励,所以他应该怎么摆放这n堆大米,才能拿到最多的奖励。

输入格式:

第一行,一个数n,表示码农场主给出了n堆大米。

第二行,输入n个数,表示每一堆大米的数量,大米的数量要么是1 要么是2。

输出格式:

一个数ans,小鸡最多能拿到多少奖励

样例:

 
  1. 5
  2. 1 2 1 2 1
 
  1. 4
 
  1. 9
  2. 1 1 2 1 1 1 2 1 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值