一开始 rte 是因为用了%I64d而没用%lld。在VJ上做的忘了是UVA上的题
后来 tle 是因为用了 while(scanf("%lld %lld",&k,&n),k+n) 而没用 while(scanf("%lld %lld",&k,&n)&&k)。题目描述与样例输入不符。还记得刘汝佳的一句话:程序要尽量写的鲁棒,因为哪怕是世界级的比赛,都会因为题目描述错了或者疏忽从而导致无法AC。这次有教训了。搞了好久。
至于如何理解解法。
首先要有一个思路上的转换,题目问的是k个气球n层楼,至少要多少次实验。然后可以将问题转化为,k个气球j次实验最多能干掉几层楼。不好说怎么理解,解决办法就是自己找几个例子,手动算一算就会感觉到其中的奥妙。
然后剩下的DP就简单了。主要是思路转换难。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[101][64];
int main()
{
for(ll i=1;i<=100;i++)
for(ll j=1;j<=63;j++)
dp[i][j]=dp[i-1][j-1]+1+dp[i][j-1];
ll k,n;
while(scanf("%lld %lld",&k,&n)&&k)
{
ll ans=lower_bound(dp[k]+1,dp[k]+64,n)-dp[k];
if(ans==64) puts("More than 63 trials needed.");
else printf("%lld\n",ans);
}
return 0;
}