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 // 빠른 입력을 위한 클래스
}
}
結果
最初は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 // 빠른 입력을 위한 클래스
}
}
結果
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 // 빠른 입력을 위한 클래스
}
}
Reference
この問題について(19941バーガー配分), 我々は、より多くの情報をここで見つけました https://velog.io/@idj7183/19941-햄버거-분배テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol