Codeforces Round #104 (Div. 2) ABCD

A - Lucky Ticket

char a[55];
int n;

int main()
{
    while( ~scanf("%d", &n) ) {
        scanf("%s", a+1);
        n = strlen( a+1 );
        int s1 = 0, s2 = 0;
        bool OK = 1;
        for( int i = 1; i <= n; ++i ) {
            if( i <= n/2 )
                s1 += a[i] - '0';
            else
                s2 += a[i] - '0';
            if( a[i] != '4' && a[i] != '7' )
                OK = 0;
        }
        if( s1 != s2 )
            OK = 0;
        if( OK )
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}

B - Lucky Mask

Petya loves lucky numbers very much. Everybody knows that lucky numbers are positive integers whose decimal record contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

Petya calls a mask of a positive integer n the number that is obtained after successive writing of all lucky digits of number n from the left to the right. For example, the mask of number 72174994 is number 7744, the mask of 7 is 7, the mask of 9999047 is 47. Obviously, mask of any number is always a lucky number.

Petya has two numbers — an arbitrary integer a and a lucky number b. Help him find the minimum number c (c > a) such that the mask of number c equals b.

Input

The only line contains two integers a and b (1 ≤ a, b ≤ 105). It is guaranteed that number b is lucky.

Output

In the only line print a single number — the number c that is sought by Petya.

Sample test(s)
Input
1 7
Output
7
Input
100 47
Output
147
const int N = 200020;

int a, b, x;

int main()
{
    while( ~scanf("%d%d", &a, &b) ) {
        int x = a+1;
        while( 1 ) {
            int p[10], l = 0;
            int tmp = 0, z = x;
            while( z ) {
                if( (z % 10 == 4) || (z % 10 == 7) )
                    p[++l] = z % 10;
                z /= 10;
            }
            for( int i = l; i >= 1; --i )
                tmp = tmp * 10 + p[i];
            if( tmp == b )
                break;
            x++;
        }
        printf("%d\n", x);
    }
    return 0;
}

C - Lucky Conversion

Petya loves lucky numbers very much. Everybody knows that lucky numbers are positive integers whose decimal record contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

Petya has two strings a and b of the same length n. The strings consist only of lucky digits. Petya can perform operations of two types:

  • replace any one digit from string a by its opposite (i.e., replace 4 by 7 and 7 by 4);
  • swap any pair of digits in string a.

Petya is interested in the minimum number of operations that are needed to make string a equal to string b. Help him with the task.

Input

The first and the second line contains strings a and b, correspondingly. Strings a and b have equal lengths and contain only lucky digits. The strings are not empty, their length does not exceed 105.

Output

Print on the single line the single number — the minimum number of operations needed to convert string a into string b.

Sample test(s)
Input
47
74
Output
1
Input
774
744
Output
1
Input
777
444
Output
3
其实就是找同一位置ab串不同时的数量

const int N = 100005;
char a[N], b[N];

int main() {
    scanf("%s%s", a, b);
    int l = strlen(a);
    int cnt47 = 0, cnt74 = 0;
    for (int i = 0; i < l; ++i) {
        if (a[i] == '4' && b[i] == '7') {
            ++cnt47;
        }
        if (a[i] == '7' && b[i] == '4') {
            ++cnt74;
        }
    }
    printf("%d\n", max(cnt47, cnt74));
    return 0;
}

Petya loves lucky numbers very much. Everybody knows that lucky numbers are positive integers whose decimal record contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

Petya 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 = 747747, then cnt(4) = 2, cnt(7) = 4, cnt(47) = 2, cnt(74) = 2. Petya wants the following condition to fulfil simultaneously: cnt(4) = a1, cnt(7) = a2, cnt(47) = a3, cnt(74) = a4. Petya is not interested in the occurrences of other numbers. Help him cope with this task.

Input

The single line contains four integers a1, a2, a3 and a4 (1 ≤ a1, a2, a3, a4 ≤ 106).

Output

On the single line print without leading zeroes the answer to the problem — the minimum lucky number d such, that cnt(4) = a1, cnt(7) = a2, cnt(47) = a3, cnt(74) = a4. If such number does not exist, print the single number "-1" (without the quotes).

Sample test(s)
Input
2 2 1 1
Output
4774
Input
4 7 3 1
Output
-1
贪心构造

Let we have some string result s. Let then delete all repititions, i. e. while we have some pair adjacent equal digits, we delete one of them. Let call formed string a root. In root there will be no adjacent equal digits, so |cnt(47) - cnt(74)| ≤ 1. So, if |a3 - a4| > 1, then answer is "-1". Now, if we would know the root, that will be used in our result, we can create result. 

You can see, that if a3 = a4, then root must be 47474747...474 or 747474...747. If a3 < a4, then root is 74747474....74. If a3 > a4, then root is 474747...47. Length of the root must be such that it fulfill a3 and a4.

Now, when you have a root, you can build result. You just need to find first occurrence of 4 in root and insert the rest of 4 from a1 right next to that digit. To add the rest of 7, you need to find last occurrence of 7 in root.

The answer does not exits if, after constructing the root, you have used more 4 than a1 or more 7 than a2.

或见代码

#include <bits/stdc++.h>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <time.h>
#include <vector>
#include <cstdio>
#include <string>
#include <iomanip>
///cout << fixed << setprecision(13) << (double) x << endl;
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define ls rt << 1
#define rs rt << 1 | 1
#define pi acos(-1.0)
#define eps 1e-8
#define Mp(a, b) make_pair(a, b)
#define asd puts("asdasdasdasdasdf");
typedef long long ll;
typedef pair <int, int> pl;
//typedef __int64 LL;
const int inf = 0x3f3f3f3f;

string ans;
int a1, a2, a3, a4;

int main()
{
    while( ~scanf("%d%d%d%d", &a1, &a2, &a3, &a4 ) ) {
        ans = "";
        if( abs( a3-a4 ) > 1 || a3 > a1 || a3 > a2 || a4 > a1 || a4 > a2 || a3+a4 >= a1+a2 ) {
            puts("-1");
            continue;
        }
        //   4444444444474747
        if( a3 == a4 + 1 ) {
            for( int i = 1; i <= a1 - a3; ++i ) {
                ans += '4';
            }
            for( int i = 1; i <= a3; ++i ) {
                ans += '4';
                ans += '7';
            }
            for( int i = 1; i <= a2 - a3; ++i )
                ans += '7';
        }
        //   74444444447474777777777774
        else if( a3 == a4 - 1 ) {
            ans += '7';
            ans += '4';
            for( int i = 1; i <= a1-a4; ++i ) {
                ans += '4';
            }
            for( int i = 1; i < a4-1; ++i ) {
                ans += '7';
                ans += '4';
            }
            for( int i = 1; i <= a2 - (a4-1); ++i )
                ans += '7';
            ans += '4';
        }
        //    7444444474747777774
        else {
            if (a1 - a4 - 1 >= 0 && a2 - a4 >= 0) {
                for(int i = 1; i <= a1 - a4 - 1; ++ i)
                    ans += '4';
                for(int i = 1; i <= a4; ++ i) {
                    ans += '4';
                    ans += '7';
                }
                for(int i = 1; i <= a2 - a4; ++ i)
                    ans += '7';
                ans += '4';
            }
            else if (a1 - a4 >= 0 && a2 - a4 - 1 >= 0) {
                ans += '7';
                for(int i = 1; i <= a1 - a4; ++ i)
                    ans += '4';
                for(int i = 1; i <= a4; ++ i) {
                    ans += '4';
                    ans += '7';
                }
                for(int i = 1; i <= a2 - a4 - 1; ++ i)
                    ans += '7';
            }
        }
        cout << ans << endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值