Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 게리멘더링2
- 5397
- qorwns
- 백준 5397
- 해시 구현
- 백준 1406
- 구현
- C/C++ 구현
- 별 찍기 10
- 풀이
- heap
- 백준
- 자료구조
- 시간 복잡도
- Stack 이란
- 원판 돌리기
- 1764
- dfs
- 버킷 정렬
- 백준 1158
- c#
- AVL 시간 복잡도
- 스택의 특징
- 해시구현
- 백준 17779
- ㅣ풀이
- 백준 17471
- 조세퍼스 순열
- 백준 17822
- 백준 2447
Archives
- Today
- Total
홍시홍의 프로그래밍
[백준 6236] 용돈 관리 본문
분류 : 이분 탐색
요구사항
효율적으로 돈을 사용하기 위한 최소 금액 구하기
풀이
아래 문제 요구사항은 인출하는 경우가 m보다 작으면 okay로 해석할 수 있다.
현우는 M이라는 숫자를 좋아하기 때문에, 정확히 M번을 맞추기 위해서 남은 금액이 그날 사용할 금액보다 많더라도 남은 금액은 통장에 집어넣고 다시 K원을 인출할 수 있다.
이분 탐색으로
금액을 정해보고 가능하다면 더 작은 금액을 찾아보고(정답 갱신)
불가능 하다면 더 큰 금액을 찾아서 답을 구한다.
#include <iostream>
using namespace std;
int n,m;
int map[100100];
bool check(int val){
int money=val;
int cnt=1;
for(int i =0 ; i < n ; i++){
if(map[i]>val){
return false;
}
//현재 가진거 보다 작다면 현재 가진 돈에서 뺀다
if(money >= map[i]){
money -=map[i];
}
else{
money = val;
money -=map[i];
cnt++;
}
/*
if(money - map[i] <0){
money= val;
cnt++;
}
money -= map[i];
*/
}
if(cnt<=m) return true;
else return false;
}
int main(){
scanf("%d%d",&n,&m);
int sum=0;
for(int i=0 ; i < n ; i++){
scanf("%d",&map[i]);
sum+=map[i];
}
int low=0;
int high=sum;
int ans=0;
while(low<=high){
int mid = (low+high)/2;
//된다면 더 작을걸 찾아야됨
if(check(mid)){
ans=mid;
high = mid - 1;
}
//안된다면 큰 거
else{
low = mid + 1;
}
}
cout<<ans<<endl;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 9461] 파도반 수열 (0) | 2020.04.25 |
---|---|
[백준 10473] 인간대포 (0) | 2020.04.25 |
[백준 3108] 로고 (0) | 2020.04.11 |
[백준 1912] 연속합 (0) | 2020.04.09 |
[백준 1932] 정수 삼각형 (0) | 2020.04.09 |
Comments