白駿-10799号(鉄棒)


質問元:https://www.acmicpc.net/problem/10799
質問する
  • 本以上の鉄棒をレーザーで切ります.効率的に動作するために、鉄棒を下から上へ重ね、上から垂直にレーザーを発射し、鉄棒を切断します.鉄棒とレーザーの配置は以下の条件を満たす:
  • 鉄棒は自分より長い鉄棒にしか置けません.鉄棒を別の鉄棒の上に置くと、端点が重ならないように完全に含まれるように配置されます.
  • 角鉄棒を切断する少なくとも1つのレーザ光が存在する.
  • レーザは、いずれの鉄棒の両端にも重ならない.
  • 以下の図は、上記の条件を満たす例を示す.水平に描かれた太い実線は鉄棒で、点はレーザーの位置で、垂直に描かれた破線の矢印はレーザーの発射方向です.

  • これらのレーザーと鉄棒の配置は、括弧で左から右に順に表すことができます.
  • レーザは、左かっこと右かっこの隣接対「()」として表現される.また、すべての「()」はレーザー光を表す必要があります.
  • 鉄棒の左端は左括弧"(",右端は右括弧")"で表される.

  • 前例のカッコは図に表されます.

  • 鉄棒はレーザで数枚に切断され、上記の例では、最上位の2本の鉄棒はそれぞれ3枚と2枚に切断され、このようにして与えられた鉄棒は全部で17枚に切断された.

  • 鉄棒とレーザーの配置を表す括弧が与えられた場合、切断された鉄棒片の総数を求めるプログラムを作成してください.
  • import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
    
    	public static void main(String[] args) throws IOException {
    		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    		
    		char[] temp = reader.readLine().toCharArray();
    		
    		int pipeCnt = 0;
    		int answer = 0;
    		
    		for (int i = 1, size = temp.length; i < size; i++) {
    			if (temp[i] == '(') {
    				if (temp[i - 1] == '(') pipeCnt++; // 파이프의 시작
    			} else if (temp[i] == ')') {
    				if (temp[i - 1] == ')') { // 파이프의 끝
    					answer += 1;
    					pipeCnt--;
    				}
    				else answer += pipeCnt; // 레이저 컷
    			}
    		}
    		
    		System.out.println(answer);
    	}
    
    }
    何とかして
  • スタックでロックを解除し、試行配列でロックを解除する方法で解決しました.
  • を見つけるルールは、「(」が「前は」にナビゲートされている場合)、「前は」がパイプの開始を意味するため、パイプの数が増加します.
  • ")"で""にナビゲートした場合、前は""であり、これはパイプが終了したことを意味するため、パイプを追加し、パイプ全体の数を減らす.
  • 」を探索する手順では、前面が「(」であればレーザーで切断する場合)であるため、現在のパイプの個数で追加する.