codeforces Gym - 101485 D Debugging (2015-2016 Northwestern European Regional Contest (NWERC 2015))
题目描述:
这题题意其实很不好理解,你有一个n行的程序,现在程序运行了r时间之后停止了运行,证明此处有一个bug,现在你需要在程序中加printf来调试找到bug所在的位置,你每次加一个printf所需的时间为p,为你在最坏的情况下最少需要多少时间找到bug。
枚举二分三分四分一直到n-1
查询一般二分查找,这个因为有个printf条件可以实现精准3分到n-1分查找,
因为三分的话也可以像二分一样确定到底是哪个
就像1000范围内猜数 如果三分能确定的话就不会用二分 但是三分并不能确定
因为你猜数他只告诉你你报的(一个)数 与答案大小的比较
而这个printf可以告诉你2个三个或者更多 所以可以三分四分等等
几分最优是由n的大小和printf辅助时间二者共同确定的
二分是log2N+printf的时间*log2N 的样子 然后三分是log3N+printf的时间*log3N
所以枚举几分的同时也要记录 n为某个值时的最优时间 下次再到这个值时就不用重复搜索了
#include <bits/stdc++.h> #include <cmath> using namespace std; #define ll long long #define F(i,a,b) for(ll i=a;i<=b;++i) #define R(i,a,b) for(int i=a;i<b;++i) #define mem(a,b) memset(a,b,sizeof(a)) ll n; ll r,p; ll a[1000100]; ll dfs(ll n) { ll ans=1e18; if(n==1||n==0) return 0; if(a[n]) return a[n]; F(i,1,n-1) { ans=min(ans,dfs(n/(i+1)+((n%(i+1))?1:0))+i*p+r); } return a[n]=ans; } int main() { cin>>n>>r>>p; ll ans=0; if(n==1) { puts("0");return 0; } ans=dfs(n); printf("%I64d\n",ans ); return 0; }