CF538B-Quasi Binary
题目链接:https://ac.nowcoder.com/acm/problem/110925
题意:给定一个正整数(\(1\leq n \leq 10^6\)),定义一种伪二进制:(数值大小为10进制,仅由01组成),寻找k个数,使得k最小,且这k个伪二进制数和为n。
思路:简单贪心构造:k为n中各位数字里数值最大的数,k个数中这一位为1,其他位数值是多少则表明k个数中此位有多少个1
坑点:a[j]--表示j位已经输出了一个1了,应该减去,不应该else下边去减,否则会导致a[j]<0,bool类型只把0作为flase 其他值都为true,因而会导致构造的k个数中1的数目过多
while(a[len]==0)len--;
for(int j=len;j>=0;j--){
if(a[j]){
cout<<1;
a[j]--;
}
else cout<<0;
}
反思:编码能力只有多写,多遇到失误和差错等情况并去解决才会提高编码能力和debug能力。
#include<iostream>
using namespace std;
int n;
void solve(){
int a[10]={0};
int len=0,ans=0;
while(n){
a[len++]=n%10;
n/=10;
ans=max(ans,a[len-1]);
}
cout<<ans<<endl;
for(int i=0;i<ans;i++){
while(a[len]==0)len--;
for(int j=len;j>=0;j--){
if(a[j]){
cout<<1;
a[j]--;
}
else cout<<0;
}
cout<<" ";
}
}
int main (){
cin>>n;
solve();
return 0;
}

浙公网安备 33010602011771号