반응형
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 | 31 |
Tags
- 연결요소
- Kafka
- 6987
- @P0
- OFFSET
- 파라메트릭
- 백준
- Docker
- msSQL
- 성적평가
- 매개변수탐색
- 물채우기
- 이분탐색
- upper_bound
- dfs
- softeer
- 13908
- 경력
- 처우산정
- 처우협의
- compose
- 백트래킹
- 퇴사통보
- BOJ
- 소프티어
- 기술면접
- BFS
- incr
- 오퍼레터
- boj #19237 #어른 상어
Archives
- Today
- Total
기술 블로그
2613번 숫자구슬 본문
728x90
반응형
https://www.acmicpc.net/problem/2613
굉장히 코드가 더럽다..
푼 후에 정리를 못 했다.
다음에 다시 풀어보면서 정리해야할 것.
핵심은 우선 mid를 구하면서 temp vector에 인덱스를 넣는다.(sum과 mid를 고려하면서)
그리고 27번째 줄을 고려해야한다.
마지막에는 무조건 인덱스가 들어가야한다.
그리고 ans vector도 갱신해주고
86 ~ 89번 째 줄처럼 계산해준다.
ans2의 size가 m보다 작다면 뒤에서부터 1 초과인 숫자들을 1씩 감소시켜주면서 push_back(1)을 해준다.
그룹을 추가시키기 위함.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include<bits/stdc++.h> using namespace std; int n, m; vector<int> v, ans, temp; int calc(int s, int e) { return 0; } bool chk(int mid) { int sum = 0, gc = 1; temp.clear(); for (int i = 0; i < v.size(); i++) { sum += v[i]; if (sum > mid) { ++gc; sum = v[i]; temp.push_back(i - 1); } if (i == v.size() - 1) { temp.push_back(i); } if (gc > m || v[i] > mid) { return false; } } return true; } int ps(int Left, int Right) { int ret = 2e9; while (Left <= Right) { int mid = (Left + Right) / 2; if (chk(mid)) { if (ret > mid) { ret = mid; ans = temp; } Right = mid - 1; } else { Left = mid + 1; } } return ret; } int main() { cin.tie(0); scanf("%d %d", &n, &m); int sum = 0; v.assign(n, 0); for (int i = 0; i < n; i++) { scanf("%d", &v[i]); sum += v[i]; } if (m == 1) { printf("%d\n%d\n", sum, n); return 0; } printf("%d\n", ps(0, sum)); vector<int> ans2; int before = 0; for (auto i : ans) { ans2.push_back(i + 1 - before); before = i + 1; } int as2 = ans.size(); if (as2 < m) { for (int i = as2 - 1; i >= 0; i--) { while (ans2[i] > 1 && ans2.size() < m) { --ans2[i]; ans2.push_back(1); } if (ans2.size() == m) { break; } } } for (auto i : ans2) { printf("%d ", i); } printf("\n"); return 0; } | cs |
728x90
반응형
'알고리즘 문제 > BOJ' 카테고리의 다른 글
1648번 격자판 채우기 (0) | 2020.03.14 |
---|---|
2916번 자와 각도기 (0) | 2020.03.14 |
1981번 배열에서 이동 (0) | 2020.03.13 |
1508번 레이스 (0) | 2020.03.13 |
11404번 플로이드 (0) | 2020.03.12 |