jzxxojc++数组:2935: 序列翻转

题目描述
给定一个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;
}