哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛)L Lucky Number By Assassin 杀人的模拟题

Description Alex loves lucky numbers very much. Everybody knows that lucky numbers are positive integers whose decimal record contains only the lucky digits 6 and 8. For example, numbers 68, 688, 6 are lucky and 5, 18, 467 are not.

Alex loves long lucky numbers very much. He is interested in the minimum lucky number d that meets some condition. Let cnt(x) be the number of occurrences of number x in number d as a substring. For example, if d = 868868, then cnt(6) = 2, cnt(8) = 4, cnt(68) = 2, cnt(86) = 2. Petya wants the following condition to fulfil simultaneously: cnt(6) = a1, cnt(8) = a2, cnt(68) = a3, cnt(86) = a4. Alex is not interested in the occurrences of other numbers. Help him cope with this task.

Input Input contains multiple test cases. For each test case , the single line contains four integers a1, a2, a3 and a4 (1 ≤ a1, a2, a3, a4 ≤ 1000000).

Output For each test case, output a single line print without leading zeroes the answer to the problem — the minimum lucky number d such, that cnt(6) = a1, cnt(8) = a2, cnt(68) = a3, cnt(86) = a4. If such number does not exist, print the single number “-1” (without the quotes).

Sample Input
2 2 1 1

Sample Output
6886

为什么说他杀人,因为我太水了。。。这个题目看似难其实水。。。

首先我们判断一下“68”和“86”的个数必须是有关系的,他们的绝对值相差不超过1!我们推一下,如果我们想68比86多2个,那么68 68,中间加上谁呢?加上8或者6都会影响到最后68和86的值,那么我们发现只有:
cnt(68)==cnt(86)
cnt(68)==cnt(86)+1
cnt(68)==cnt(86) -1
三种情况。

情况一:cnt(68)==cnt(86)

这个时候就是68686或者86868的组合,首尾一定是封闭的。那么为了最小我们一定要先优先第一种情况,第一种情况至少要满足:
cnt(6)>=cnt(68) +1 and cnt(8)>=cnt(68)
这种情况下多余6加到开头,多余8加到68686最后一个8的后面。
给个例子:
4 3 2 2
6686886

如果第一种挂了,那么我么还可以选择第二种情况,但是必须满足
cnt(6)>=cnt(68) and cnt(8)>=cnt(68)+1
这个时候6一定只有cnt(68)个了(否则一定是第一种情况最好),8补到末尾即可。
栗子:
2 6 2 2
86868888

如果都不满足肯定就不可能了输出-1

情况二:cnt(68)==cnt(86)+1

这个时候是类似6868686868的组合,注意这个必须满足:
cnt(6)>=cnt(68) and cnt(8)>=cnt(68) 这个要注意了
之后有6补到开头,有8补到末尾。

粒子:
5 5 3 2
6668686888

情况三:cnt(68)==cnt(86)-1
这个时候是类似86868686的组合,注意这个必须满足:
cnt(6)>=cnt(86) and cnt(8)>=cnt(86) 这个要注意了
之后有6补到868686第一个6后面,有8补到868686 最后一个8后面。

李子:
5 5 2 3
8666868886

思路:猛一下不好做出来,细心也是还好,主要还是我太菜了
。。。

#include<bits/stdc++.h>
using namespace std;
long long n,k;
int main(){
    long long  i,j;
    long long a,b,c,d;
    while(scanf("%lld%lld%lld%lld",&a,&b,&c,&d)!=EOF){
        string s="";
        if(c==d){
            if(a>=c+1&&b>=d){ 
                for(i=1;i<=a-(c+1);i++) s+="6";   
                for(i=1;i<=c;i++){
                    if(i!=c) s+="68";
                    else {
                        s+="6";
                        for(j=1;j<=b-(c-1);j++) s+="8";
                        s+="6";
                    }
                } 
                cout<<s<<endl;
            }
            else if(a>=c&&b>=d+1){ 
                for(i=1;i<=c;i++) 
                s+="86";
                for(i=1;i<=b-c;i++) s+="8";  
                cout<<s<<endl;
            }
            else {
                cout<<-1<<endl;
            }
        }
        else if(c==d+1){
            if(a>=c&&b>=c){                 //注意判断条件 
                for(i=1;i<=a-c;i++) s+="6";
                for(i=1;i<=c;i++) s+="68";
                for(i=1;i<=b-c;i++) s+="8";
                cout<<s<<endl;
            }
            else {
                cout<<-1<<endl;
            }
        }
        else if(c==d-1){
            if(a>=d&&b>=d){                 //注意判断条件 
                s+="8";
                for(i=1;i<=a-(d-1);i++) s+="6";
                for(i=1;i<=d-2;i++) s+="86";
                for(i=1;i<=b-(d-1);i++) s+="8";
                s+="6"; 
                cout<<s<<endl;
            }
            else {
                cout<<-1<<endl;
            }
        }
        else {
            cout<<-1<<endl;
        }
    }
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值