vpEducational Codeforces Round 104 (Div. 2)

A - Lucky Ticket

题意:先给出一个幸运数的概念:一个数是幸运数,当且仅当这个数只由4或者7组成,然后给出一个数,要你判断这个数是否满足条件,他必须是幸运数同时他的前半部分的数的和和后半部分数的和相等

思路:其实就是模拟,先构造一个字符串为"47",用字符串读进这个数,判断他的每一位是否都是"47"的子串,有不是的直接输出"NO",再记录和就行(挺简单的)

代码:

void solve()
{
    cin >> n;
    cin >> s;
    string t = "47";
    int sum1 = 0, sum2 = 0;
    s = " " + s;
    for (int i = 1; i <= (s.size() - 1) / 2; i++)
    {
        sum1 += s[i] - '0';
        if (t.find(s[i]) == -1)
        {
            cout << "NO" << endl;
            return;
        }
    }
    for (int i = (s.size() - 1) / 2 + 1; i <= (s.size() - 1); i++)
    {
        sum2 += s[i] - '0';
        if (t.find(s[i]) == -1)
        {
            cout << "NO" << endl;
            return;
        }
    }
    if (sum1 == sum2)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}

B - Lucky Mask

题意:给你一个数a,b,其中b是幸运数,要你找到一个最小的c满足c>a同时c的码和b的一样,码指的就是一个数从左到右中是4或者7的数的组合(按照原来的顺序),

题意:其实判断下就行,如果a<b,那么这个数肯定是b,如果a>b,则就暴力模拟就行,每次让a++,再判断a的码是不是和b的相同就行

代码:

void solve() // 找到一个大于a的最小的c使得c的幸运数和b相同
{
    cin >> a >> b;
    if (a < b)
        cout << b << endl;
    else
    {
        while (1)
        {
            a++;
            string sum = to_string(a);
            string temp = to_string(b);
            string s = "";
            for (auto it : sum)
                if (it == '4' || it == '7')
                    s += it;
            if (s == temp)
            {
                cout << a << endl;
                return;
            }
        }
    }
}

C - Lucky Conversion

题意:给你两个长度相同的字符串a,b,只含有4和7,你每次可以进行一下操作:1将一个数反转,就是4变成7,7变成4,  2交换两个数的位置,问你最少进行多少次操作可以让a等于b

思路:其实很容易想到先进行交换(可以减少两个不同的位置),再进行反转即可,所以只要统计下不同的位置中4和7的数量。然后取最大值就行

代码:

void solve() // 找到一个大于a的最小的c使得c的幸运数和b相同
{
    string a, b;
    cin >> a >> b;
    int cnt1 = 0, cnt2 = 0; // 不一样的1,记录4 2 记录7的
    for (int i = 0; i < a.size(); i++)
    {
        if (a[i] != b[i])
        {
            if (a[i] == '4')
                cnt1++;
            else
                cnt2++;
        }
    }
    cout << max(cnt1, cnt2) << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值