codevs1288 埃及分數 迭代加深 剪枝

2021-08-23 14:24:58 字數 1482 閱讀 7474

在古埃及,人們使用單位分數的和(形如1/a的, a是自然數)表示一切有理數。 如:2/3=1/2+1/6,但不允許2/3=1/3+1/3,因為加數中有相同的。 對於乙個分數a/b,表示方法有很多種,但是哪種最好呢? 首先,加數少的比加數多的好,其次,加數個數相同的,最小的分數越大越 好。 如: 19/45=1/3 + 1/12 + 1/180 19/45=1/3 + 1/15 + 1/45 19/45=1/3 + 1/18 + 1/30, 19/45=1/4 + 1/6 + 1/180 19/45=1/5 + 1/6 + 1/18. 最好的是最後一種,因為1/18比1/180,1/45,1/30,1/180都大。 給出a,b(0

發現搜尋的話沒有上界,所以要設定每一次搜尋的層數,也就是迭代加深。

然後發現如果窮舉的話連第一層都搜不完,於是我們可以規定只從大分數往小分數搜,每一次擴大分母的範圍,如果目前的分數*還剩餘的層數+目前的和《給定的分數,那麼就可以退出了,因為後面一直加最大的分數也加不到給定的分數了。

#include

#define rep(i,a,b) for(register int i=a;i<=b;++i)

#define drep(i,a,b) for(register int i=a;i>=b;--i)

#define pii pair

#define fi first

#define se second

#define mk make_pair

typedef

long

long ll;

using

namespace

std;

void file()

inline pii operator + (pii x,pii y)

inline pii operator - (pii x,pii y)

inline

bool

operator

< (pii x,pii y)

pii a,t[1010],qu[1010];

bool flag;

inline

void dfs(int k,ll now,int lim)

else

else

if(t[lim].se==qu[lim].se)

else

if(t[i].se>qu[i].se)return;}}

return;

}now=max(now,a.se/a.fi);

ll tp=now*(lim-k+1);

for(register ll i=now;i<=tp;++i)

}int main()*/

a=mk(x,y);

int ans=1;

while(1)

rep(i,1,ans)printf("%lld ",qu[i].se);

//cout<<(double)clock()/clocks_per_sec0;}

codevs2072 分配房間

題目描述 description yh擁有一條街道,街道上共有n間房子,每間房子的座標為xi yh的房子比較神奇,可能重疊 同時,yh有m個女朋友 這是事實 yh打算給每位女朋友分配一間房子。兩個女朋友間的距離相隔越近,她們之間產生衝突的可能就越高。yh想盡可能的減小女朋友間的衝突,於是他打算讓他的...

CODEVS 2702 分配房間

題目描述 description yh擁有一條街道,街道上共有n間房子,每間房子的座標為xi yh的房子比較神奇,可能重疊 同時,yh有m個女朋友 這是事實 yh打算給每位女朋友分配一間房子。兩個女朋友間的距離相隔越近,她們之間產生衝突的可能就越高。yh想盡可能的減小女朋友間的衝突,於是他打算讓他的...

codevs 1725 探險 (二分)

二分答案 這個題目要求 體力和最小的那個小組的所有人的體力和盡量大 很明顯我們二分最小體力 如果合法 逐漸放大 但是這裡我們二分的是最小而不是最大 所以累加的體力 ans時 跳過當前體力i 可以認為把他歸給了上一組 累加和 0 繼續分組 include include include define ...