牛客练习赛13 C-幸运数字III

本文介绍了一个有趣的算法问题:如何通过特定规则对一个初始数字进行多次变换,并最终确定经过大量变换后的数字形态。此问题涉及字符串操作及循环检测等计算机科学概念。
部署运行你感兴趣的模型镜像
链接: https://www.nowcoder.com/acm/contest/70/C
来源:牛客网

题目描述

定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
假设现在有一个数字d,现在想在d上重复k次操作。
假设d有n位,用d 1,d 2,...,d n表示。
对于每次操作,我们想要找到最小的x (x < n),使得d x=4并且d x+1=7。
如果x为奇数,那么我们把d x和d x+1都变成4;
否则,如果x为偶数,我们把d x和d x+1都变成7;
如果不存在x,那么我们不做任何修改。
现在请问k次操作以后,d会变成什么样子。

输入描述:

第一行两个整数n,k表示d的长度和操作次数。
第二行一个数表示d。数据保证不存在前导零。
1 <= n <= 100,000
0 <= k <= 1000,000,000

题解:
k可能很大,但是可以让t[0]不再变化时跳出,或者t[0]的变化
可能会进入一个循环,但这个循环的长多一定是2,因此可以对2取余。
代码:

#include<bits/stdc++.h>
using namespace std;
char t[4][100007];
int L,k;
void ds(int id)
{
    for(int i=0;i<L-1;i++)
    {
        if(t[0][i]=='4'&&t[0][i+1]=='7')
        {
            if(i&1)t[0][i]=t[0][i+1]='7';
            else t[0][i]=t[0][i+1]='4';
            break;
        }
    }
    for(int i=0;i<L;i++)
        t[id][i]=t[0][i];
}
int main()
{
    scanf("%d%d%s",&L,&k,&t[0]);
    int ans=0;
    while(k--)
    {
        ds(ans%3+1);
        ans++;
        if(ans%3==0)
        {
            if(strcmp(t[1],t[3])==0)
                break;
        }
    }
    k=k%2;
    for(int i=0;i<k;i++)
    {
        ds(1);
    }
    printf("%s\n",t[0]);
    return 0;
}

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值