ページ 11

おかしなところがあったらごしてきくださいorz

Posted: 2017年6月22日(木) 01:13
by makaraito

コード:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int i;
    int d,n;
    int *a;
    char *rl;
    int sum;
    
    scanf("%d %d",&d,&n);
    a = (int*)calloc(n,sizeof(int));
    rl = (char*)calloc(n,sizeof(char));
    
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    
    sum = a[0];
    rl[0] = 1;
    i = 1;
    
    while(i<n){
        if(rl[i]==0){
            rl[i] = 1;
            sum += a[i];
            if(abs(sum)>d){
                sum -= a[i];
            }else{
                i++;
            }
        }else if(rl[i]==1){
            rl[i] = 2;
            sum -= a[i];
            if(abs(sum)>d){
                sum += a[i];
            }else{
                i++;
            }
        }else{
            rl[i] = 0;
            i--;
        }
        
    }
    
    if(abs(sum)<=d){
        
    }else{
        while(i>0);
    }
    
    for(i=0;i<n;i++){
        if(rl[i]==1) printf("R");
        else if(rl[i]==2)printf("L");
        else while(i>0);
    }
    printf("\n");



    return 0;
}
標準入力からdとnがきて、
n分のaが来て、
そのaを左右に動かすプログラムなんですが、
1週間考えてもわからないのでお力をお貸しくださいorz

2分木を片っ端から探索する感じのコードのつもりです。
出力に無限ループが含まれてるのはエラーチェックです(失敗しても、出力違いかランタイムエラーかしかわからないため)

Re: おかしなところがあったらごしてきくださいorz

Posted: 2017年6月22日(木) 02:20
by box
makaraito さんが書きました:

コード:

    if(abs(sum)<=d){
        
    }else{
        while(i>0);
    }
ここの無限ループはいいんですか?

Re: おかしなところがあったらごしてきくださいorz

Posted: 2017年6月22日(木) 11:29
by makaraito
無限ループは大丈夫です!

このコードだとうまく探索できてなさそうな感じのところがあったらおしえてください!orz

Re: おかしなところがあったらごしてきくださいorz

Posted: 2017年6月22日(木) 11:53
by purin52002
こんにちは

いくつか質問があります。
makaraito さんが書きました: n分のaが来て、
そのaを左右に動かすプログラムなんですが、
1週間考えてもわからないのでお力をお貸しくださいorz
何を基準にaを左右に動かすんですか?
makaraito さんが書きました: 2分木を片っ端から探索する感じのコードのつもりです。
二分木はどれですか?

木構造を扱う場合は、再帰処理を使うと結構簡単になると思うのですが、
再帰なんてコストがかかりすぎる!男ならループを使え!
みたいな制約があったり、、、?

日本語力が低い+自称初心者ですので的外れなことを聞いているかもしれませんが、お答えしていただけると嬉しいです^^;

出力がおかしくなりそうな入力についてですが、dを小さく(0とか)aを大きく(100とか)するとおかしくなるような気がします。

Re: おかしなところがあったらごしてきくださいorz

Posted: 2017年6月22日(木) 12:20
by makaraito
さいきも考えたのですが、今回はなんとなくループにしてみました!
+-dの範囲内で絶対値aを+かーに移動させ続けるかんじです!
sumの値にaの値を足す、引くしていってます
1<=d,n<=1000、1<=a<=2d

の範囲で入力されます!

2分木は+-で別れる感じですね
+から探索していって、だめなら-に、-もだめならrlを0にして一個前に戻る感じです

Re: おかしなところがあったらごしてきくださいorz

Posted: 2017年6月22日(木) 18:58
by purin52002
入力範囲にも制限があるなら大丈夫な気がします。(プログラム側で制限をかけたほうが安全かも)

というか実際にエラー起こしてから原因を考えるタイプだから、生のソース見てもわからないというのが本音です^p^

Re: おかしなところがあったらごしてきくださいorz

Posted: 2017年6月23日(金) 19:48
by makaraito
出力結果が表示されない系の問題なのでほんとわかんない\(^o^)/オワタ

知恵をお貸しいただきましてありがとうございました!
諦めます!!!!orz