19941バーガー配分

9484 ワード

問題を理解する


ハンバーガーは人と同じ単位で並べられています.
この時、人々は自分の位置からK未満のハンバーガーしか食べられなかった.
(つまり、インデックスの違いはKより小さくなければならない)
このような条件の下で、ハンバーガーが食べられる人は最大の問題です.

問題を解く


最初はDP問題で解決しようとしたが、なかなか方法が思いつかなかった.
したがって,我々は範囲内のすべての領域を検査することによって問題を解決するだけである.
ここには核心的な考えがある.
いずれにしてもKはすべての人にとって共通に適用される値である.
したがって、J 2人目がJ-K~J+Kの2番目のハンバーガー(J+1)を食べられなければ、2人目はJ-K~J+Kの2番目の存在のすべてを摂取することができない.
(前の人は摂取していなかったので、次の人は前の人より食べられるハンバーガーの範囲を右に移動したので、以前確認した分は食べられませんでした)
それを利用して問題を解決した.

コード#コード#

import java.io.*;
import java.util.*;

public class Main {
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) {
		FastReader sc = new FastReader();

		int N = sc.nextInt(); // H & P 수
		int K = sc.nextInt(); // K
		String str = sc.next();
		
		int prev_eat = 0; 
        # 이전에 먹었던 햄버거 Index + 1
        # 즉, Search를 시작할 Index
        
		int num = 0;
		for(int i =0;i<N;i++) {
			if(str.charAt(i)=='P') { // Person일 경우에만 확인
				boolean check = false;
                
				int left = Math.max(prev_eat, i - K);
				int right = Math.min(i+K, N-1);
                // left ~ right 범위를 확인
                // i - K나 i + K개 Index 범위를 넘어설 수 있으므로 처리해 줬다
                
				for(int j = left;j<=right;j++) {
					if(str.charAt(j)=='H') {
                        /*
                        햄버거를 먹을 수 있는 상태
                        j번째 햄버거를 먹었으므로, 다음 사람은 j+1번째 index
                        부터 확인해보면 된다.
                        */
						prev_eat = j+1;
						num++;
						check = true;
						break;
					}
				}
				if(!check) {
                    /*
                    먹을 수 있는 햄버거가 left ~ right 범위에는 없음
                    따라서, 이 다음에 있는 Person들도 left ~ right에 존재하는
                    모든 햄버거를 먹을 수 없다.
                    
                    prev_eat은 Search를 시작하는 위치이다.
                    left ~ right은 확인할 필요가 없으므로 right+1로 값 지정
                    */
					prev_eat = right+1;
				}
				
			}
			
		}
		System.out.println(num);	
	}
	
	static class FastReader // 빠른 입력을 위한 클래스
    }
}

結果


  • の2行目は間違っています.食べられるハンバーガーが左右の範囲にない場合、次の検索が必要な開始位置はright+1です.でも勘違いして、(i+1)と勘違い.