RQNOJ在线评测系统 T107 Ural的鹰蛋实验 解题思路

作者&投稿:夷心 (若有异议请与网页底部的电邮联系)
第一想法二分,不过是错的。

假设有i层j个蛋,在第k层做实验丢下一个蛋,这个蛋有两个状态1)碎了2)没碎。

1)当蛋碎了那我们就只需要找前k-1层,因为蛋碎了所以还有j-1个蛋

2)当蛋没有碎那我们就只需要找后面的i-k层,因为蛋没有碎所以还有j个蛋

因为是最坏情况,所以应该是两种情况中最大的一个

我们就可以得到动态转移方程了:

设f[i,j]表示有i层j个蛋做实验的最坏情况的最小植

所以f[i,j] = min{max{f[k-1,j-1],f[i-k,j]}+1} (1<=k<=i)

但这个方程的时间复杂度是O(N3),对10003是肯定要超时的。前面说了二分得到的答案不是最优,不过在二分的过程中我们发现1000层最多也就10个蛋,所以但蛋的个数大于10的时候项当于只有10个蛋。所以蛋只当它有10个,所以现在的时间复杂度为O(1000*1000*10)就不会超时了。

《Ural的鹰蛋实验》算法说明

最容易想到的是二分贪心,但那是不对的。

应该用动规解:

举个例子,10层楼,2个蛋,那么就是要求a[10][2]

第一次试验有10种选择——1到10层

如果选第3层,最坏情况下当然E!=3,如果E<3,蛋就碎了(关键!),那么还需要a[2][1]次

如果E>3,那么还需要a[7][2]次,由于考虑最坏情况,取两个的最大值,再加1

如果n层楼,m个蛋,其实就是

for(i=1;i<=n;i++) a[n][m]=min{1+max{a[i-1][m-1],a[n-i][m]}}

当然还要注意剪枝。

1000层楼,最多需要10个蛋

题目是URAl1223。

program ural1223;

const

maxn=1000;

maxn2=10;

var

min,max,n,k,l,i,j:integer;

a:array[0..maxn,0..maxn2]of integer;

r:real;

begin

assign(input,'c.in');

assign(output,'c.out');

reset(input);

rewrite(output);

for i:=1 to maxn do

begin

a[i,0]:=0;

a[i,1]:=i;

end;

for i:=1 to maxn2 do

begin

a[1,i]:=1;

a[0,i]:=0;

end;

for i:=2 to maxn2 do

for j:=2 to maxn do

begin

min:=maxint;

for k:=1 to j do

begin

if a[k-1,i-1]>a[j-k,i] then l:=a[k-1,i-1]

else l:=a[j-k,i];

if min>l then min:=l;

end;

a[j,i]:=min+1;

end;

read(n,k);

if n>10 then writeln(a[k,10])

else writeln(a[k,n]);

close(input);

close(output);

end.

一c般来讲不d行,,,特殊方2法:打神马b,输神马r vκlb埢q→b埢uāax

鹰会生蛋吗?~

鹰属于 隼形目----属于鸟纲
脊椎动物亚门的一纲。体均被羽,恒温,卵生,胚胎外有羊膜。前肢成翅,有时退化。多营飞翔生活。心脏是2心房2心室。骨多空隙,内充气体。呼吸器官除肺外,有辅助呼吸的气囊。
这样一来 你应该知道
鹰是和家鸡,鸭子,一样是生蛋的了吧

水煮、蒸蛋、炒蛋、生吃
或者通过母鸡or孵蛋器制造小老鹰(真是鹤立鸡群啊!)
嘿嘿,不错吧