吉大机试(3)-怪异的洗牌
作者:
因为yxc爱上编程
,
2024-04-25 10:38:32
,
所有人可见
,
阅读 18
竟然过了,纯暴力模拟,一点点找规律写的hhhh
注意的点就是单开一个辅助数组,因为a[i]经过好几次变换后,里面的数值就不是对应的i了,不能直接在i上面操作
补充的算法技巧:可以利用reverse函数
对于shift操作进行三次翻转,前一部分翻转一次,后一部分翻转一次,整体翻转一次就可以将后面部分移到前面,对于flip操作直接reverse一次----------原地操作
#include<iostream>
#include<algorithm>//在多次变化的过程中a[i]里面的值就不是i了
using namespace std;
const int N=1e3+10;
int a[N];
int n,k;
void shift(int x){
int b[N];
for(int i=1;i<=n-x;i++)
b[i]=a[x+i];
for(int i=n-x+1;i<=n;i++)
b[i]=a[i+x-n];
for(int i=1;i<=n;i++)
a[i]=b[i];
}
void flip(){
int x=n/2;
int b[N];
for(int i=1;i<=x;i++)
b[i]=a[x+1-i];
for(int i=1;i<=x;i++)
a[i]=b[i];
}
int main()
{
scanf("%d%d", &n,&k);
for(int i=1;i<=n;i++)
a[i]=i;
while(k--){
int x;
scanf("%d",&x);
shift(x);
flip();
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
#include<iostream>
#include<algorithm>//在多次变化的过程中a[i]里面的值就不是i了
using namespace std;
const int N=1e3+10;
int a[N];
int n,k;
void shift(int x){
reverse(a+1,a+1+x); //+1的原因是因为下标从1开始
reverse(a+1+x,a+n+1);//?////////////起始还是从a+1+x开始???
reverse(a+1,a+1+n);
}
void flip(){
reverse(a+1,a+n/2+1);
}
int main()
{
scanf("%d%d", &n,&k);
for(int i=1;i<=n;i++)
a[i]=i;
while(k--){
int x;
scanf("%d",&x);
shift(x);
flip();
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}