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 |
29 | 30 |
Tags
- BFS
- 역방향 반복자
- dfs
- 그래프
- 분할정복
- AWS
- 그리드 알고리즘
- 브루트포스
- 자료구조
- 순열
- 알고리즘
- 다이나믹프로그래밍
- github action
- 도커
- 다이나믹 프로그래밍
- 자바
- GIT
- 백준
- SQL
- TCP
- 컴퓨터 네트워크
- 재귀
- CI/CD
- Spring
- 분할 정복
- 이분탐색
- 트리
- HTTP
- 그리드
- 스프링
Archives
- Today
- Total
코딩성장스토리
백준 1654번:랜선 자르기 본문
https://www.acmicpc.net/problem/1654
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
이 문제는 랜선의 길이를 구해야한다. 랜선의 길이 최댓 값을 구하기 위해 이분 탐색을 이융했다.순차 탐색을 하기에는 시간 초과가 나와 더 효율적인 이분탐색을 썻다.
랜선의 길이는 당연히 정렬 되어 있기에 이분탐색을 쓸 수 있고 랜선의 길이가 크면 랜선갯수는 적게 나오고 작으면 더 많이 나온다.
즉 n보다 크거나 같다라는 조건을 만족하면 left값을 mid+1로 지정하고 만족하지 않으면 right를 mid-1로 지정하면 된다.그러면 최대인 랜선값이 나온다.
코드를 보장
#include <iostream>
#include <vector>
using namespace std;
long long k,n;
bool check(vector<int>& v,long long x){ //x이 값이 n보다 작은지 아닌지 판단
long long cnt=0;
for(int i=0;i<k;i++){
cnt+=(v[i]/x);
}
return cnt>=n;
int main(){
cin>>k>>n;
long long max=0;
vector<long long> v(k);
for(int i=0;i<k;i++){
cin >> v[i];
if(max<v[i]){
max=v[i];
}
}
long long ans=0;
long long left=1;
long long right=max;
while(left<=right){ //랜선 길이 구하기 위한 이분탐색
long long mid=(left+right)/2;
if(check(v,mid)){ //mid값이 n보다 작지 않으면 길이 최대값 구하기위해 left를 mid+1지정
if(ans<mid){
ans=mid;
}
left=mid+1;
}
else{ //mid값이 n보다 작으면 n보다 커져야하기 때문에 right=mid-1지정
right=mid-1;
}
}
cout <<ans;
}
'백준 코딩' 카테고리의 다른 글
백준 2110번: 공유기 설치 (0) | 2022.01.22 |
---|---|
백준 2805번:나무 자르기 (0) | 2022.01.21 |
백준 1717번:집합의 표현 (0) | 2022.01.19 |
백준 2606번: 바이러스 (0) | 2022.01.18 |
백준 3015번 :오아시스 재결합 (0) | 2022.01.17 |