题目描述
小C学习了数组,知道数组可以存放很多的数。现在数组里面按顺序存放n个数。以中间为界,把这些数分成两份,把第二份的第1个数插入到第一份的第1和第2个数之间,把第二份的第2个数插入到第一份的第2和第3个数之间,……直到第二份没有数为止,是一次操作。m次同样的操作以后,请把的新的数组输出来。
输入
第一行,两个整数n,m,表示数组有n个数,执行m次操作。(1≤n≤1000,1≤m≤10000000)
第二行,n个整数,分别表示数组的各个元素。(1≤各个元素≤10000)
输出
n个整数,分别表示新的数组。
样例输入 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">5 2
1 2 3 4 5
</span></span></span></span></span>
样例输出 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">1 5 4 3 2</span></span></span></span></span>
提示
样例1说明:
第1次操作以后:1 4 2 5 3
第2次操作以后:1 5 4 3 2
【输入样例2】
4 1
1 2 3 4
【输出样例2】
1 3 2 4
分类:周期。
思路如下:
1,数据很大,所以用正常的方法做肯定超时。
2,既然如此,那我们就可以从另一个方向去想,那个方向就是:他第几次会变回原来的数组(就是找周期)。
题解如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1005],jl,zq,xb,b[1005],c[1005];
int f()
{
for(int i=1;i<=n;i++)
if(c[i]!=a[i])return 0;
return 1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
for(;;)
{
jl++,xb=1;
for(int i=1;i<=n;i+=2)
{
c[i]=b[xb];
xb++;
}
for(int i=2;i<=n;i+=2)
{
c[i]=b[xb];
xb++;
}
for(int i=1;i<=n;i++)
b[i]=c[i];
if(f()==1)break;
}
zq=m%jl;
while(zq--)
{
xb=1;
for(int i=1;i<=n;i+=2)
c[i]=b[xb],xb++;
for(int i=2;i<=n;i+=2)
c[i]=b[xb],xb++;
for(int i=1;i<=n;i++)
b[i]=c[i];
}
for(int i=1;i<=n;i++)
cout<<c[i]<<" ";
return 0;
}