列表

详情


NC20880. 小可爱序列

描述

我愿意舍弃一切,以想念你,终此一生。
”到后来,只能将记忆拼凑。“ ——QAQ
小可爱刚刚把KR的序列切开了,但是她还没有玩够,于是就又双叒叕打乱了佳佳刚刚买回来的序列。
但是还好,佳佳通过监控记录下来了小可爱的打乱方式,于是把小可爱送回家之后,现在佳佳要还原这个序列。
佳佳需要维护一个长度为n的序列,小可爱只用了以下两种操作:
a.将最后一个数挪到第一位
b.将序列第3位挪到第一位
你需要给出最后的序列

输入描述

第一行两个数
n,m为序列长度,不同的操作“次数”
接下来m行,每行一个由数字+字母组成的字符串
保证所有的字符串只有一个字母,字符集S为S={'a','b'}并且只会在字符串最后一位出现。
字符串表示的是,要做的操作次数,操作类型。
比如“3a”就是你这一步要重复3次a操作,
"4b"就是这一步要重复操作4次b操作。

输出描述

一行用空格隔开的n个数,表示所有操作做完之后的序列

示例1

输入:

4 2
1 2 3 4 
1a 
2b 

输出:

1 2 4 3

说明:

第一次做一次a操作 变为 4 1 2 3

第二次连着做两次b操作 变为1 2 4 3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 35ms, 内存消耗: 504K, 提交时间: 2019-11-11 20:38:15

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e4+11;
ll a[maxn],b[maxn];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>a[i];
    int p;
    char s;
    while(m--)
    {
       cin>>p>>s;
        if(s=='a')
        {
            p=p%n;
            for(int i=0;i<n;i++)
                b[(i+p)%n]=a[i];
            for(int i=0;i<n;i++)
                a[i]=b[i];
        }
        if(s=='b')
        {
             p=p%3;
            for(int i=0;i<3;i++)
                b[(i+p)%3]=a[i];
            for(int i=0;i<3;i++)
                a[i]=b[i];
        }
    }
    for(int i=0;i<n;i++)cout<<a[i]<<" ";
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 30ms, 内存消耗: 608K, 提交时间: 2020-03-15 12:13:45

#include<bits/stdc++.h>
using namespace std;
int n,m,a[2005],p,b[2005];
char ch;
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	cin>>a[i];
	for(int i=1;i<=m;i++)
	{
		cin>>p>>ch;
		if(ch=='a')
		{
			p%=n;
			for(int i=0;i<n;i++)
			b[(i+p)%n]=a[i];
			for(int i=0;i<n;i++)
			a[i]=b[i];
		}
		if(ch=='b')
		{
			p%=3;
			for(int i=0;i<3;i++)
			b[(i+p)%3]=a[i];
			for(int i=0;i<3;i++)
			a[i]=b[i];
		}
	}
	for(int i=0;i<n;i++)
	cout<<a[i]<<" ";
	return 0;
}

上一题