洛谷[ABC146C] Buy an Integer题解

整体思路:

这道题题目较水,大概黄题左右。

题目注意:

  • 答案的范围是大于等于 1,小于等于 1e9。

  • 若无解,输出 0。样例没有。

因为他的整数是从一到n的固定,我们不妨打表(俗话说:暴力出奇迹,打表得省一~)

但打表不管怎样,还是太麻烦了,以至于我这个蒟蒻根本就不想写。

所以我们来分析一下标签里的二分

用 l 来记录左边界,初始值为 1;用 r 来记录右边界,初始值为 1e9。当 check 函数返回 1 时,代表 mid 符合条件,收缩左区间;否则,收缩右区间。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a,b,x,l=1,r=1000000000;//左右边界赋初始值
inline ll read(){
    char c=getchar();ll x=0,f=1;
    while((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')c=getchar(),f=-1;
    while(c<='9'&&c>='0'){
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}// 快读
bool check(ll mid){
    ll sum=mid*a,num=0;
    while(mid!=0){
        mid/=10;
        num++;
    }//记录mid的位数
    return (sum+num*b)<=x;//判断,若价格小于等于x,符合条件,返回1
}
int main(){
    a=read();b=read();x=read();
    if(a+b>x){
        printf("0");
        return 0;
    }//特判无解情况
    while(l<r){
        ll mid=(l+r+1)/2;
        if(check(mid))l=mid;
        else r=mid-1;
    }//二分模板寻找答案
    printf("%lld",r);
    return 0;//好习惯
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值