Codeforces #467 (Div. 2) B. Vile Grasshoppers 蚂蚱的题目

zj讲了半天,我什么都没听懂,我只是想自己看看我就能明白吧,我?哈哈哈,高数作业还没写,算法课要不要上

http://blog.csdn.net/wang2332/article/details/79373271

**题意有点重要,其实也就是从2到p这些数字,按倍数往后算吧,直到跳不到,界限 是y


那么也就是说有个素数的话,肯定大于素数,因为素数是肯定满足题意的,那个跳不到的点如果由于p的原因并不是素数的话,也肯定是在素数的后面,因为素数已经是极限情况了.

#include<iostream>
using namespace std;
//那我们,怎么想呢.
int p, y;
bool ornot(int x)
{//判断这个数是否满足条件
	//*****用&&的话,只要有一个是假的就要返回假的
	//这里用max写也可以
	//当数据量特别大的时候,针对一个...针对一个数据吧如果他坚持是素数你还继续往后面算
	找素数,请记住,i*i<=x
	for (int i = 2; i*i<=x&&i <= p; i++)//其实还是少了
	{
		if (x%i == 0)//饿,这个,很大很大的x,被分配了,所以不参加,
			return false;
	}
	//	return false;
		return true;//如果他最后也没能够分配,那就是他了
}
//另外再注意两点...一个是,p是可以到达所以上面是i=2到i=p
//以及,下面要一直减小减小到j>p算作是条件吧
//对于大数据我们当然无可奈何.. 但是小数据比如 3 4 这个还是要卡死的
//然后按照题意来就是那个树枝还是已经被占领了的.. 所以这里p不能等于
int main()
{
	//int p, y;
	cin >> p >> y;
	for (int j = y;j>p; j--)
	{
		if (ornot(j))
		{
			cout << j << endl;
			return 0;//break;
		}
	}cout << "-1" << endl;
	//如果到了
	return 0;
}

别人的...

//我不理你了,随便你吧
//0309

#include<iostream>
using namespace std;

#define CLR(a,b) memset(a,(b),sizeof(a))
#define LL long long

const int MAXN = 1e3 + 10;
const double eps = 1e-15;
int p, y;
bool prime(int x)
{//也就是x>=sqrt i 就是计算从2到后面吧,从i到p,max也可以,这个&&哪个成立都可以
	for (int i = 2; i*i <= x && i <= p; i++) {
		if (x%i == 0)//i++,如果x%i==0也就是可以除得尽,就跑了好了,
			//如果一直循环完了都不行的话,...你就去死吧... 所以嗯
			return false;
	}
	return true;
}

int main()
{
	cin >> p >> y;//i是,从2到p的一个范围
	//然而他却,倒着从后面往前寻找
	//如果寻找的过程中,在2到p里面并不能达到这个数字,就输出好了
	for (int i = y; i > p; i--) {
		if (prime(i)) {
			cout << i << endl; return 0;
		}
	}
	cout << -1 << endl;
	return 0;
}

最后时间上卡的是...i<sqrt(x),还是p那个.....

差距很多吗?

很多!!!!!!!如果p很大很大,有1e8,那么你每一次都要1e8 个循环....

然后这一次这么多就快要超时了..

但是这个i*i<=x,x=1e8时,也只要花费根号x的时间就好了

!!!这可是关键啊

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值