题目描述
给定一个N个数的数组,M次操作。每次操作将数组的一段翻转,求最后的数组。
输入
第一行两个整数N,M(N,M≤1000)含义见试题描述。
第二行N个整数,表示原来的数组。
接下来M行,每行两个整数X,Y(1≤X≤Y≤N),表示翻转区间[X,Y]。
输出
一行N个整数,表示操作后的数组。
样例
输入 复制
5 2
1 2 3 4 5
2 4
4 5
输出 复制
1 4 3 5 2
没有太好的建议,用一个辅助数组记录从y到x的值 然后对应原数组的x到y以此赋值,模拟吧
供参考:
#include <stdio.h>
#define LEN 1001
void Reverse(int a[],int n,int x,int y)
{
int left = x - 1,right = y - 1;
if(left < 0 || right < 0 || left >= n || right >= n)
return;
while(left < right)
{
a[left] = a[left] + a[right];
a[right]= a[left] - a[right];
a[left] = a[left] - a[right];
left++; right--;
}
}
int main()
{
int i, N, M, X, Y, a[LEN]={0};
scanf("%d%d",&N,&M);
for(i = 0;i < N;i++)
scanf("%d",&a[i]);
for(i = 0;i < M;i++)
{
scanf("%d%d",&X,&Y);
Reverse(a,N,X,Y);
}
for (i = 0;i < N; ++i)
printf("%d ",a[i]);
return 0;
}