codeforces Gym - 101485 D Debugging (2015-2016 Northwestern European Regional Contest (NWERC 2015))

本文探讨了一种通过在程序中插入printf语句进行调试的方法,并分析了如何选择最优的分割策略来快速定位bug,同时提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

点击打开链接

这题题意其实很不好理解,你有一个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;
}

 

转载于:https://www.cnblogs.com/mfys/p/7632971.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值