标签:poj
你的朋友Jackson被邀请参加一个叫做“超级备忘录”的电视节目。在这个节目中,参与者需要玩一个记忆游戏。在一开始,主持人会告诉所有参与者一个数列,{A1, A2, ..., An}。接下来,主持人会在数列上做一些操作,操作包括以下几种:
ADD x y D:给子序列{Ax, ..., Ay}统一加上一个数D。例如,在{1, 2, 3, 4, 5}上进行操作"ADD 2 4 1"会得到{1, 3, 4, 5, 5}。
REVERSE x y:将子序列{Ax, ..., Ay}逆序排布。例如,在{1, 2, 3, 4, 5}上进行操作"REVERSE 2 4"会得到{1, 4, 3, 2, 5}。
REVOLVE x y T:将子序列{Ax, ..., Ay}轮换T次。例如,在{1, 2, 3, 4, 5}上进行操作"REVOLVE 2 4 2"会得到{1, 3, 4, 2, 5}。
INSERT x P:在Ax后面插入P。例如,在{1, 2, 3, 4, 5}上进行操作"INSERT 2 4"会得到{1, 2, 4, 3, 4, 5}。
DELETE x:删除Ax。在Ax后面插入P。例如,在{1, 2, 3, 4, 5}上进行操作"DELETE 2"会得到{1, 3, 4, 5}。
MIN x y:查询子序列{Ax, ..., Ay}中的最小值。例如,{1, 2, 3, 4, 5}上执行"MIN 2 4"的正确答案为2。
为了使得节目更加好看,每个参赛人都有机会在觉得困难时打电话请求场外观众的帮助。你的任务是看这个电视节目,然后写一个程序对于每一个询问计算出结果,这样可以使得Jackson在任何时候打电话求助你的时候,你都可以给出正确答案。
#include <iostream> using namespace std; class intList { int * data; int length; public: intList() { data = NULL; length = 0; } void add( int x,int y,int D ) { for( int i=x;i<=y;i++ ) { data[i-1] += D; } } void reverse( int x,int y ) { for(int i = 0; i < (y-x+1)/2 ; i++) { int d = data[x+i-1]; data[x+i-1] = data[y-i-1]; data[y-i-1] = d; } } void revolve(int x,int y,int T) { int len = y - x + 1; int m = T<(len-T)? T:(len - T); T = T % len; if( T != 0 ) if( len % m == 0 ) { for(int i=0;i<m;i++) { int flag = i; int flag_data = data[i+x-1]; int j = i ; while ( (j+T)%len != flag ) { int d = data[(j+T)%len + x-1]; data[(j+T)%len + x-1] = flag_data ; flag_data = d; j = (j+T)%len ; } data[flag+x-1] = flag_data; } } else { int flag = 0; int flag_data = data[flag+x-1]; int j = 0; while( (j+T)%len != flag ) { int d = data[(j+T)%len + x-1] ; data[(j+T)%len + x-1] = flag_data ; flag_data = d ; j = (j+T)%len ; } data[flag] = flag_data ; } } void insert( int x,int P ) { length++ ; int * big_data = new int[ length ]; for(int i=length-1;i>=x;i--) big_data[i] = data[i-1]; big_data[x-1] = P; for(int i=x-2;i>=0;i--) big_data[i] = data[i]; delete [] data; data = big_data; } void delete_x(int x) { for( int i = x-1;i < length-1 ; i++ ) { data[i] = data[i+1]; } length -- ; } int min(int x,int y) { int min = INT_MAX; for(int i=x; i<=y; i++) { if(data[i-1] < min ) min = data[i-1]; } return min; } void print_list() { for( int i=0; i<length; i++ ) { cout<<data[i]<<" "; } cout<<endl; } }; int main() { intList mylist; for(int i=1;i<10;i++) mylist.insert(i,i); mylist.print_list(); mylist.insert( 1,4 ); mylist.add( 1,9,1 ); mylist.print_list( ); mylist.delete_x( 3 ); mylist.print_list( ); cout<<mylist.min(5,9)<<endl; mylist.revolve(1,6,4); mylist.print_list( ); mylist.reverse(1,4); mylist.print_list(); system("pause"); return 0; }
标签:poj
原文地址:http://blog.csdn.net/cqs_experiment/article/details/40478391