日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

枚举法 POJ1411

發布時間:2025/5/22 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 枚举法 POJ1411 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給3個數 m ,a,b, 求兩個素數 c和d,

使得 c*d<=m a/b<=c/d<=1

其中m>4, a/b<=1

思路

窮舉素數 c(1,3,5,7,9,….m) c的窮舉范圍為(0,m)中所有的素數。

對于每一個窮舉的c,根據e=c*b/a,確定d的范圍為 (c,e)之間 的素數,

再在c確定的情況下,在d的范圍(c,e)之中尋找一個素數使得c*d的面積最大,并且c*d<=m;

通過程序

#include <math.h>

#include<iostream>

#include <algorithm>

#include <cstdio>

//判斷是否是質數

bool isPrime(int t)

{

int mid =(int)(sqrt((double)t));

for(int i=2;i<=mid;i++)

if(t%i==0)

return false;

return true;

}

/*

給3個數 m ,a,b, 求兩個素數 c和d,

使得 c*d<=m a/b<=c/d<=1

其中m>4, a/b<=1

第一次審題后的解法

窮舉素數 c(1,3,5,7,9,….m) c的窮舉范圍為(0,m)中所有的素數。

對于每一個窮舉的c,根據e=c*b/a,確定d的范圍為 (c,e)之間的素數,再在c確定的情況下,在d的范圍(c,e)之中尋找一個素數使得c*d的面積最大,并且c*d<=m;

枚舉的優化策略

改變枚舉次序

改變比較情況時所花的時間

剪枝--減少邊界條件的枚舉情況.

在本例中可以優化的地方為 確定p和q的取值范圍,

對于確定的m,p和q為質數,所以p和q最多取到sqrt(m);

因為m<=100000, sqrt(100000)=316.999,

所以p和q最多取到317

*/

int main(void)

{

int m,a,b,c,tt,temp,width,height;

double d,e,min;

long tempm,max;

while(1)

{

std::cin>>m>>a>>b;

if(m==0)break;

max=0;

/*

因為m的最大值為100000,所以可以確定在a=b的情況下,width和height的最大值最多為317,所以可以減少遍歷時間

*/

for(c=2;c<=317;c++)

{

if(isPrime(c)==true)

{

//e的取值為 min(m/c,c*b/a)

e=((double)c*b)/a;

min=m/c;

if(min<e)e=min;

for(tt=e;tt>=c;tt--) //確定c的范圍后在c到E之間找一個最大的質數,使其滿足條件c*tt<=m,對于tt為從大到小開始遍歷

{

if(isPrime(tt))

{

tempm=c*tt;

if(tempm<=m&&tempm>max)

{

width=c;

height=tt;

max=tempm;

break;

}

}

}

}

}

std::cout<<width<<" "<<height<<std::endl;

}

return 0;

}

轉載于:https://www.cnblogs.com/smile2you/archive/2010/03/10/1682963.html

總結

以上是生活随笔為你收集整理的枚举法 POJ1411的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。