fc2ブログ



Hanafuda Shuffle

2006.06.29 14:09  ACM/ICPC

問題: ACM/ICPC 2004 Problem A

[考察]
プログラミング入門の問題に適し、ACM/ICPCの肝を突いている問題です。初心者にとってはやや難しく、中級者にとっても、しっかり設計して挑まないとうっかりミスをしやすい問題ではないでしょうか。

[解説]
、をするまでもないのですが、いくつかポイントを。
まず、分かりやすいように配列のインデックスは1baseとし、以下のように初期化すると良いと思います。
hanafuda1.gif

cut( p, c ) という関数(操作)を、例えば以下のようにしっかり設計することが重要です。
hanafuda2.gif


[プログラム例 (C)]

#include<stdio.h>
#define MAX 50

int n, r;
int D[MAX+1], tmp[MAX+1];

void cut( int p, int c ){
    int i;
    for ( i = p; i < p + c; i++ ) tmp[i-p+1] = D[i];
    for ( i = 1; i < p; i++ ) tmp[i+c] = D[i];
    for ( i = 1; i < p + c; i++ ) D[i] = tmp[i];
}

void simulate(){
    int p, c, i, rest;
    
    for ( i = 1; i <= n; i++ ) { D[i] = n-i+1; }
    for ( i = 0; i < r; i++ ){
        scanf("%d %d", &p, &c);
        cut( p, c );
    }
    
    printf("%d\n", D[1]);
}

int input(){
    scanf("%d %d", &n, &r);
    if ( n == 0 && r == 0 ) return 0;
    return 1;
}

int main(){
    while ( input() ) simulate();
    return 0;
}
スポンサーサイト



テーマ : プログラミング - ジャンル : コンピュータ

| コメント(0) | トラックバック(0) | ↑ページトップ |

この記事へのコメント

コメントを書く


管理人にのみ表示

↑ページトップ

この記事へのトラックバック

この記事にトラックバックする(FC2ブログユーザー)

↑ページトップ