Codeforces Round #104

A-Lucky Ticket

题意:第一行给一个数字n,代表数字的位数;第二行给出数字;规定数字的前一半部分的和与后一半部分的和相等,并且整个数字都是由7或者4构成的数字,我们称为幸运数,让你判断这个数字是不是幸运数,是的话就输出YES,不是则输出NO。

思路:按照题意进行模拟就可以,前一半部分和后一半部分的和可以用ascii来表示。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    string t;
    cin>>t;
    int sum1 = 0,sum2 = 0;
    int flag = 0;
    for(int i = 0;i<n/2;i++)
    {
        sum1+=int(t[i]-'0');

    }for(int i = n/2;i<n;i++)
    {
        sum2+=int(t[i]-'0');
    }
    for(int i = 0;i < n;i++)
    {
        if(t[i]!='4'&&t[i]!='7')
            flag = 1;
    }
    if(sum1==sum2&&!flag)
        cout<<"YES"<<endl;
   else cout<<"NO"<<endl;

}

B-Lucky Mask

题意:给你两个数a和b,并且b是幸运数(定义见上一题),求一个最小的、比a大的数字c,让c的掩码等于b(掩码:数字中舍弃掉除了4和7的其他数字,剩下的由4和7组成的数字);

思路:从a+1开始,一个一个数字进行判断,如果掩码等于b那就输出(不会超市,因为两个相邻的数字差不超过67)

#include<bits/stdc++.h>
using namespace std;
string fun(int a)
{
    string t;
    while(a)
    {
        if(a%10==4||a%10==7)
        {
            t+=a%10+'0';
        }
        a/=10;
    }
    reverse(t.begin(),t.end());
    return t;
}
int main(){
    int a;
    string b;
    cin>>a>>b;
    int sum = a+1;
    while(fun(sum)!= b)
    {
        sum++;
    }
    cout<<sum<<endl;
}

C-Lucky Conversion

题意:给你两个幸运数字(定义见A题)a和b,你可以进行两个操作:①将7替换成4或者将4替换成7;②交换b中的两个数字

求将a变成b的最小步数。

思路:求出a、b两个数字对应位置不同的数量,并且记录a的个数,输出a中4和7中数量多的那个数字。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    cin>>a>>b;
    int a4n = 0,b4n = 0,a7n = 0,b7n = 0;
    for(int i = 0;i < a.length();i++)
    {
        if(a[i]!=b[i])
        if(a[i]=='4')
            a4n++;
        else if(a[i]=='7')
            a7n++;
    }cout<<max(a7n,a4n)<<endl;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务