AcWing 3586. 怪异的洗牌
原题链接
简单
作者:
NCpaste
,
2023-03-22 15:24:12
,
所有人可见
,
阅读 168
#include <stdio.h>
int a[1010];
int b, c, d;
int e[1010];
void shift(int d) {
int ind = 1;
for (int i = d+1; i <= b; i ++) {
e[ind++] = a[i];
}
for (int i = 1; i <= d; i ++) {
e[ind++] = a[i];
}
for (int i = 1; i <= b; i ++) {
a[i] = e[i];
}
return ;
}
void flip()
{
int ind ;
int m;
// 6 3 1 2 3
if (b % 2 == 0) {
ind = b/2;
}
else {
ind = b-1;
ind /= 2;
}
if (ind % 2 == 0) {
m = ind/2;
} else {
m = ind-1;
m /= 2;
}
for (int i = 1; i <= m; i ++) {
int t = a[i];
a[i] = a[ind];
a[ind] = t;
ind --;
}
return;
}
int main () {
scanf ("%d%d", &b, &c);
for (int i = 1; i <= b; i ++) {
a[i] = i;
}
for (int i = 0; i < c; i ++) {
scanf("%d", &d);
shift(d);
flip();
}
for (int j = 1; j <= b; j ++) {
printf ("%d ", a[j]);
}
printf ("\n");
return 0;
}
/*
20 10
2 15 16 1 7 15 9 14 18 20
*/
与下标运算有关的计算,最好从1开始,从0开始太乱了,而且容易错,还找不到错误
注意在flip中,不仅总长度需要判断是否%2,交换时候的界限(m)也要判断%2