[2023csp-j模拟]替换

文章讲述了AC君进行卡片交换操作的游戏,初始序列递增,通过取模5的规则进行n次操作。关键在于发现每30次操作后的重复模式,从而优化算法避免超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

AC君有6张卡片,分别写着从1到6的整数。
最初,从左到右从1到6的卡片以递增的状态排列。
在这里插入图片描述
AC君会执行n次操作,第i次操作(i=0,1,2…n-1)将从左数第(i mod 5)+1张与第(i mod 5)+2张卡片的位置互换,其中mod表示取余操作。

下面是n=5时的操作演示

i=0时
i=在这里插i=0图片描述
i=1时

在这里插入图片描述
i=2时
在这里插入图片描述
i=3时
在这里插入图片描述
i=4时
在这里插入图片描述

最终n=5可以得到234561的卡片顺序。

请你帮助AC君编程求出最终卡片的状态

样例

输入:5
输出:234561
2.
输入:100000000
输出:345612

思路

这道题乍一看很简单,只需要知道swap函数即可,即:

swap(a[i%5+1],a[i%5+2]);

但是经过第二个样例的测试,程序超时了,这是因为大量数据进行遍历导致时间溢出。这时,我们需要找规律,多试几遍就知道了,数据输出以30为一组,所以输入一个n,只需要将n%30就可以了

最终代码

#include<bits/stdc++.h>
using namespace std;
//本代码版权归csdn博主小D爱编程所有,转载请标明
int main(){
long long n;
int a[7]={0,1,2,3,4,5,6};
cin>>n;
n%=30;//避免超时
for(int i=0;i<n;i++){
    swap(a[i%5+1],a[i%5+2]);
    // int tmp=0;
    // tmp=a[i%5+1];
    // a[i%5+1]=a[i%5+2];
    // a[i%5+2]=tmp;
}
for(int i=1;i<=6;i++) cout<<a[i];

	return 0;
}



鸣谢:乔斯编程的wangzhanxiong老师为我们提供了题源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值