您的位置:首页 > 大数据 > 人工智能

HDU 1239 Calling Extraterrestrial Intelligence Again

2013-09-24 21:45 405 查看
是个小搜索题吧!不过也要注意一下剪枝。

需要找到两个数(不妨设为p,q)满足以下条件:

1、 p,q均为质数;

2、p*q<=m;

3、a/b <= p/q <= 1;

要找到输出所有满足以上条件的p,q中乘积最大的一对p,q。

剪枝:

考虑大于10000的某个质数,不妨设为Q,另一个质数为P,则:

a、如果P<10,P/Q<0.001。

b、如果P>10,P*Q>100000。

而考虑到a,b的取值范围(1<=a<=b<=1000): 可知min(a/b)=0.001; 同时要求: p*q<=m<=100000。所以无论如何质数都不能超过10000。

AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int q[10008],w[2013];
int main()
{
int n,ant=0,sum,i,j,maxx;
int x,y,a,b;
double ans,cot;
memset(q,0,sizeof(q));
for(i=2;i<=10000;i++)
{
if(q[i] == 0)
{
w[ant++]=i;
for(j=2*i;j<=10000;j+=i) q[j]=1;
}
}
while(scanf("%d%d%d",&n,&a,&b) && n && a && b)
{
ans=(double )a/b;
sum=maxx=0;
for( i=0;i<ant;i++)
{
for(j=i;j<ant;j++)
{
cot=(double )w[i]/w[j];
if(cot < ans || n < w[i]*w[j]) break;

sum=w[i]*w[j];
if(maxx < sum)
{
maxx=sum;
x=w[i];y=w[j];
}
}
}
printf("%d %d\n",x,y);
}
return 0;
}


路途中。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: