티스토리 뷰
뮤직비디오
직접 짠 코드
#include <iostream>
#include <vector>
#include <algorithm>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main() {
//freopen("input.txt", "rt", stdin);
int n, i, key, mid, tmp, asum=0, sum=0, min, lt, rt, cnt=1, max=-21470000;
scanf("%d %d", &n, &key);
vector<int> a;
for(i=0; i<n; i++){
scanf("%d", &tmp);
a.push_back(tmp);
asum+=tmp;
if(max<tmp) max=tmp;
}
lt=1;
rt=asum;
while(lt<=rt){
mid=(lt+rt)/2;
if(mid<max){
min=max;
break;
}
sum=0;
cnt=1;
for(i=0; i<n; i++){
if(sum+a[i]<=mid){
sum=sum+a[i];
}else {
sum=a[i];
cnt++;
}
}
if(cnt>key){
lt=mid+1;
}
else if(cnt<=key){
min=mid;
rt=mid-1;
}
}
printf("%d", min);
return 0;
}
강의 코드
#include <iostream>
#include <vector>
#include <algorithm>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int a[1000], n;
int Count(int s){
printf("mid: %d\n", s);
int i, cnt=1, sum=0;
for(i=1; i<=n; i++){
if(sum+a[i]>s){
cnt++;
sum=a[i];
}
else sum+=a[i];
if(i<n) printf("sum: %d, ", sum);
else printf("sum: %d\n", sum);
printf("cnt: %d\n", cnt);
}
return cnt;
}
int main() {
freopen("input.txt", "rt", stdin);
int m, i, lt=1, rt=0, mid, res;
scanf("%d %d", &n, &m);
for(i=1; i<=n; i++){
scanf("%d", &a[i]);
rt+= a[i];
}
while(lt<=rt){
mid = (lt+rt)/2;
if(Count(mid)<=m){
res=mid;
rt=mid-1;
}
else lt=mid+1;
}
printf("%d", res);
return 0;
}
강의코드와 내가 짠 코드의 다른 점은 함수로 뺐다는 점이다.
마구간 정하기
#include <iostream>
#include <algorithm>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int n;
int Count(int mid, int a[]){
int i, cnt=1, pos=a[1];
for(i=2; i<=n; i++){
if(a[i]-pos>=mid){
pos=a[i];
cnt++;
}
}
return cnt;
}
int main() {
//freopen("input.txt", "rt", stdin);
int c, i, mid, min, lt=1, rt;
scanf("%d %d", &n, &c);
int *a = new int[n+1];
for(i=1; i<=n; i++){
scanf("%d", &a[i]);
}
sort(a+1, a+n+1);
rt=a[n];
while(lt<=rt){
mid=(lt+rt)/2;
if(Count(mid, a)>=c){
min=mid;
lt=mid+1;
}
else rt=mid-1;
}
printf("%d\n", min);
delete[] a;
return 0;
}
코드를 짠후에 채점프로그램을 돌렸는데 계속 timelimit이 나서 인덱스나 로직이 잘못되었는지 확인했는데
알고보니 scanf에서 입력받는 부분이 잘못되었었다.
원래 작성했던 방법은 scanf("%d %d\n", &n, &c); 였는데
%d %d뒤에 \n이 붙은 것은 %d %d와 다른 의미를 가지고 있었다.
내용은 아래 포스팅에 정리했다
'lecture > algorithm - c++' 카테고리의 다른 글
[c++] 영지선택 small, large (0) | 2020.12.30 |
---|---|
[c++] 블록의 최대값 (0) | 2020.12.29 |
[c++] 봉우리, 각 행의 평균과 가장 가까운 값 (0) | 2020.12.29 |
[c++] 공주구하기, 멀티 태스킹 (0) | 2020.12.27 |
[c++] scanf("%d %d", &a, &b)와 scanf("%d %d\n", &a, &b)차이 (0) | 2020.12.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C++
- stackframe
- server side rendering
- BFS
- 세마포어
- client side rendering
- 이진탐색
- 인접리스트
- 자료구조
- 퀵정렬
- javascript
- Stack
- 최단경로
- 교착상태
- 운영체제
- 병행프로세스
- react
- C
- 입출력장치
- 인접행렬
- 소프트웨어
- 클래스
- dfs
- 배열
- 스텍
- 구조체
- 재귀함수
- 동적프로그래밍
- 알고리즘
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함