ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

A-想要更多的0_2022河南萌新联赛第(六)场:郑州大学 (nowcoder.com)

2022-08-20 16:34:28  阅读:118  来源: 互联网

标签:10 return 2022 int ans mid 萌新 nowcoder define


A-想要更多的0_2022河南萌新联赛第(六)场:郑州大学 (nowcoder.com)

这个题思路倒是很好想到主要是处理[0,n]区间内0出现的次数

考虑这个问题 比如对3891205举例。

  1. 我们取到数第四位数,其形式也就可以是xxx0xxx这种情况你前面可以取[1,389]后面可以取[0,999]所以答案就是389*1000。这种情况是小于本位

  1. 如果我们取倒数第二位,xxxxx0x前面可以取[1,38911]后面可以取[0,9],但是我前面也可以取38912但是后面就只能取[0,5]了。所以这种情况就是38911*10+6;,这种情况是等于本位

这已经足够解决这个问题了,我们将问题延伸到1-9这样的数字,就多了一种情况就是大于本位,还是拿上面那个数举例子。xxx6xxx

这样子就是高位只能取[0,388]了,因为取389无论如何都是大于原数的。

思路来源:(11条消息) 经典的数1问题天岚1993量产机的博客-CSDN博客

#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define int long long
#define pb push_back
#define IOS cin.tie(0)->sync_with_stdio(false);
#define inf 0x7fffffff
#define endl "\n"
/*
二分肯定是二分
但是如何求一个区间内的的0的个数
求[m,n]区间内0的个数只要求[0,m-1]和[0,n]即可
求0-n这个区间内右多少个0我就直接枚举每个位置上是0数字有多少

*/
int n,k;
int sum(int x){
int ans=1,d=1,t=x;//但是如果x等于0的话就不会进入循环
while(x){
if(x%10==0)//当前位置为0的情况这种情况高位不能全为0即可并且但高位相等的情况时低位最大只能等于原数
ans+=(x/10-1)*d + (t%d+1);
else ans+=(x/10)*d;//这种情况就是高位可以取[1-389]低位可以取[0,999];
d*=10;
x/=10;
}
return ans;
}

bool check(int x){//求[x,n]区间内0出现的个数是否大于k
int t=sum(n)-sum(x-1);
return t>=k;
}
signed main(){
cin>>n>>k;
int l=0,r=n,ans=0;
if(sum(n)<k){
cout<<-1<<endl;
return 0;
}
while(l<=r){
int mid=l+r>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}
 

标签:10,return,2022,int,ans,mid,萌新,nowcoder,define
来源: https://www.cnblogs.com/silky----player/p/16607981.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有