一二三四五 上山打老虎

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;
}


posted @ 2021-01-21 11:32  黒川川  阅读(85)  评论(0)    收藏  举报