Hanafuda Shuffle
2006.06.29 14:09 ACM/ICPC
問題: ACM/ICPC 2004 Problem A
[考察]
プログラミング入門の問題に適し、ACM/ICPCの肝を突いている問題です。初心者にとってはやや難しく、中級者にとっても、しっかり設計して挑まないとうっかりミスをしやすい問題ではないでしょうか。
[解説]
、をするまでもないのですが、いくつかポイントを。
まず、分かりやすいように配列のインデックスは1baseとし、以下のように初期化すると良いと思います。

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

[プログラム例 (C)]
[考察]
プログラミング入門の問題に適し、ACM/ICPCの肝を突いている問題です。初心者にとってはやや難しく、中級者にとっても、しっかり設計して挑まないとうっかりミスをしやすい問題ではないでしょうか。
[解説]
、をするまでもないのですが、いくつかポイントを。
まず、分かりやすいように配列のインデックスは1baseとし、以下のように初期化すると良いと思います。

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

[プログラム例 (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) | ↑ページトップ |