整体思路:
这道题题目较水,大概黄题左右。
题目注意:
-
答案的范围是大于等于 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;//好习惯
}