スポンサーサイト

--.--.-- --:--  スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| - | - | ↑ページトップ |




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ブログユーザー)

↑ページトップ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。