在古埃及,人們使用單位分數的和(形如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 ...