[[ACM/ICPC]]&br;
&br;
&br;
[[2004Aの問題:http://www.acm-japan.org/past-icpc/domestic2004/A.jp/A.html]]&br;
&br;
&br;
回答者:[[ほへい]]&br;
&br;
解法:逆順に切っていく。&br;
   最後に一番上にあったカードが、初めの状態でどの位置にあったかで判定。&br;
    最後に一番上にあったカードが、初めの状態でどの位置にあったかで判定。&br;
&br;
所要時間:30分&br;
&br;
速度:データセット瞬殺&br;
&br;
実行環境:PenM 1.6GHz  512M  Win2000&br;
&br;




 #include<stdio.h>
 
 int cutting[50][2];
 int num_hanahuda;
 int num_cutting;
 int answer;
 char *file_in = "2004A_in.txt";
 char *file_out = "2004A_out.txt";
 FILE *fp_in, *fp_out;
 
 void setCutting(void);
 void getAnswer(void);
 
 int main(void)
 {
    fp_in = fopen(file_in, "r");
    fp_out = fopen(file_out, "w");
    
    while(1) {
        fscanf(fp_in, "%d", &num_hanahuda);
        fscanf(fp_in, "%d", &num_cutting);
        
        printf("%d", num_hanahuda);
        printf("\n%d\n", num_cutting);
        
        setCutting();
        
        if(num_hanahuda == 0 && num_cutting == 0) break;
        
        getAnswer();
    }
    
    fclose(fp_in);
    fclose(fp_out);
    
    return 0;
 }
 
 void setCutting()
 {
    int i;
    for(i = 0; i < num_cutting; i++) {
        fscanf(fp_in,"%d", &cutting[i][0]);
        fscanf(fp_in, "%d", &cutting[i][1]);
    }
 }
 
 void getAnswer()
 {
    answer = 1;
    for(; num_cutting > 0; num_cutting--) {
        if(answer <= cutting[num_cutting - 1][0] + cutting[num_cutting - 1][1] - 1) {
            if(answer <= cutting[num_cutting - 1][1]) {
                answer += cutting[num_cutting - 1][0] - 1;
            }
            else {
                answer -= cutting[num_cutting - 1][1];
            }
        }
    }
    
    answer = num_hanahuda - answer + 1;
    
    fprintf(fp_out, "%d\n", answer);
 }

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS