“旋转乐趣” - Codechef九月长期挑战赛

时间:2014-09-13 19:53:17

标签: c

那个答案怎么了?Plz帮帮我

问题是: 你得到一个N个整数的数组A.您将完成M个查询。每个查询都有以下三种类型之一: C d:顺时针旋转阵列A d个单位。 A d:用d单位逆时针旋转阵列A. R d:查询元素的值,当前是数组A中的第d个元素。 输入

第一行包含两个数字 - 分别为N和M. 下一行包含N个空格分隔的整数,表示数组A. 以下M行中的每一行包含上述形式之一的查询。 输出

对于R类型的每个查询,在单独的行上输出答案。 约束

1≤N≤100000 1≤M≤100000 在所有查询中,1≤d≤N 1≤A≤1000000的元素 数组A和类型R的查询是从1开始的。

实施例

输入: 5 5 5 4 3 3 9 R 1 C 4 R 5 A 3 R 2 输出: 五 3 3

解决方案:

#include<stdio.h>
//#include<iostream>
//using namespace std;
int a[100001];
int index=0,n;

void clock(int);
void ant_clock(int);
void display(int);

int main()
{
    unsigned int i,m;
    char x;
    int y;
    scanf("%d %d",&n,&m);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    while(m--)
    {
        scanf(" %c%d",&x,&y);
        if(1 <= y <= n)
        {
            if(x=='R')
                display(y);
            else if(x=='A')
                ant_clock(y);
            else if(x=='C')
                clock(y);
        }
        else
            return 0;
    }
    return 0;
}

void display(int y)
{
    int j=index,x=0;
    while(1)
    {
        if(x==y-1)
            break;
        j++;
        x++;
        if(j==n)
            j=0;
    }
    printf("%d",a[j]);
}

void ant_clock(int y)
{
    int j;
    for(j=0;j<y;j++)
    {
        index--;
        if(index==-1)
            index=n-1;
    }
}

void clock(int y)
{
    int j;
    for(j=0;j<y;j++)
    {
        index++;
        if(index==n)
            index=0;
    }
}

1 个答案:

答案 0 :(得分:1)

查询索引基于1是一个问题。而且你的代码中有不必要的循环。

#include <stdio.h>

int arr[100000];

int main() {
    int base = 0, size, i, m;
    char x;
    scanf("%d%d", &size, &m);
    for (i = 0; i < size; i++)
        scanf("%d", &arr[i]);
    while (m-- > 0) {
        scanf(" %c%d", &x, &i);
        if (x == 'R') {
            printf("%d\n", arr[(base + i - 1) % size]);
        } else if (x == 'A') {
            if ((base -= i) < 0)
                base += size;
        } else if (x == 'C') {
            base = (base + i) % size;
        }
    }
    return 0;
}