【CoreForces Round #104D】Lucky Number 2

D - Lucky Number 2
题意:幸运数字由4和7组成,现在给出一个数字,已知4的个数,7的个数,47的个数和74的个数。
求解出这个数字(要求最小)
题解:一个构造题

\[abs(47的个数 - 74的个数) > 1 \]

\[4和7的个数不足无法构造 \]

满足以上条件时,无法构成,其他情况时,优先存放4,取最小值。

#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
int abs(int a){
    return a<0?-a:a;
}
int main(){
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    if(abs(c-d)>1){
        printf("-1\n");
        return 0;
    }
    string s;
    if(c==d+1){
        for(int i=0;i<c;i++){
            s+="47";
        }
    }
    if(c+1==d){
        for(int i=0;i<d;i++){
            s+="74";
        }
    }
    if(c==d){
        for(int i=0;i<c;i++){
            s+="47";
        }
        if(a>c)s+="4";
        else s="7"+s;
    }
    int ls=0,lt=0;
    for(int i=0;i<s.length();i++){
        if(s[i]=='4')ls++;
        else lt++;
    }
    if(ls>a||lt>b){
        printf("-1\n");
    }
    else{
        int fa=1;
        int na=a-ls,nb=b-lt;
        for(int i=0;i<s.length();i++){
            if(s[i]=='4'&&fa){
                fa=0;
                while(na--){
                    printf("4");
                }
            }
            if(s[i]=='7'){
                lt--;
                if(lt==0){
                    while(nb--){
                        printf("7");
                    }
                }
            }
            printf("%c",s[i]);
        }
    }
    return 0;
}
posted @ 2020-01-05 11:10  流浪AC  阅读(180)  评论(0编辑  收藏  举报