1541:失われたかっこ


これは何の問題ですか。


これは適当に括弧を付けて、与えられた式の最大値を求める問題である.
  • https://www.acmicpc.net/problem/1541
  • もしもし。


    私が考えている医徳は以下の通りです.
    Declare N = [], O = [], S = 0, i = 0. sub = false
    Get S
    while S[i] != '\0':
        if S[i] == '+' or S[i] == '-':
            partition S from i to j as a number n.
            j = i+1
            append number n to N.
            append S[i] to O.
    S = N[0]
    For i=0 to (length of O):
        if O[i] == '-':
            sub = !sub;
        if sub:
            S -= N[i+1]
        else:
            S += N[i+1]
    print S
  • で入力し、そこに数字と演算子を分けます.
  • 式の符号状態から加減し、最小値を出す.
  • めまいがする


    これは私が最終的に完成したコードです.
    #include <stdio.h>
    #include <stdlib.h>
    
    int p(char* s, int st, int en) {
        int i=0, m=0, r;
        char* ss = (char*)calloc(en-st, sizeof(char));
        for(i=st;i<en;i++)
            ss[m++] = s[i];
        r = atoi(ss);
        free(ss);
        return r;
    }
    
    int main() {
        char S[51]={0}, O[24]={0};
        int N[25]={0}, sub=0, s=0, i=0, j=0, k=0, l=0;
        scanf("%s", S);
        while(S[i]!=0) {
            if(S[i]=='+' || S[i]=='-') {
                N[k++] = p(S, j, i);
                O[l++] = S[i];
                j = i+1;
            }
            i++;
        }
        N[k++] = p(S, j, i);
        s = N[0];
        for(i=0;i<l;i++) {
            if(O[i]=='-') {
                sub = 1;
                s -= N[i+1];
            } else if(O[i] == '+') {
                if(sub) s -= N[i+1];
                else s += N[i+1];
            }
        }
        printf("%d", s);
    }
    汚いだけです.まだいくつかの試行錯誤がある.

  • 1-3-5-2-3 = ?
    ->subの状態が異なり、+または-の働き方も異なり、開始時-出現するたびにsub値が切り替わり、subが本物であれば削除し、偽物であればさらに誤ります.

  • 1-3+5-2+3 = ?
    -> 1.訂正した間違いですが、今回はsubが本物で、+出た時にマイナス記号が付けられていなかったので間違いました.

  • malloc v. calloc
    ->これは意外な伏兵なので、文字列と数字列の関数の結果値がおかしいです.例えば、50+1は50+10に等しい.結論は連続したデータを表現するにはcallocと書きます.
  • https://bunhere.tistory.com/m/255
  • 他の人はどうやってやったの?

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    	int n, result = 0;
    	char c;
    	while(scanf("%d", &n) == 1){
    		result += n;
    		c = getchar();
    		if(c == '-')
    			break;
    	}
    	while(scanf("%d", &n) == 1){
    		result -= n;
    		c = getchar();
    	}
    	printf("%d\n", result);
    }
    my 0421 krのソース
    -> https://www.acmicpc.net/source/17238597
    なんと簡潔なソースだろう.
    私の愚かな頭で問題の本質を理解するのに長い時間がかかった.結果-記号が一度現れると、後ろの数字が全部消えてしまい、複雑すぎると思います.🤔
    また、電話で受信する必要もありません.scanfの動作方式を考えれば、上記のように簡略化できると思いますが、当時はscanf("%d",&n)もNの中の数字ではなく、別のものを加えるのであれば、そうはいかないと思いました.だから和弦はそんなに長いです.
    -> https://www.ibm.com/docs/ko/i/7.3?topic=functions-scanf-read-data
    stdinの文字がformat-stringと衝突した場合、scanf()は終了します.衝突文字が読み込まれていない場合、stdinは左側にあります.
    ははは….今になってやっとこれを知った.

    に感銘を与える


    なぜ2番銀の問題がこんなに難しいと思うのか、私の方法が少し難しいからかもしれないと思っています.問題を解くのも退屈だから気分が悪い
    そしてmallocとcallocを使い分ける無知に書いたあげく、事故が起きた.