https://codeforces.com/contest/1169/problem/C
<문제설명>
0~m사이 값을 갖는 n개의 요소를 갖는 배열이 주어진다. 임의의 배열 요소을 여러개 골라 (ai+1) % m해주는 것을 하나의 operation이라 할때, 배열 a를 단조증가로 만들기 위해선 최소 몇번의 operation을 해야 하는가?
<풀이>
최소 0번 최대 m번의 operation이 필요하다. 어떤횟수 이상의 operation을 수행하면 정렬이되므로 이분탐색.
bool pos(k) : k번 operation으로 a 정렬 가능?
for(int i=0; i<n; i++) a[i]를 prev로 맞추는 게 가능하다면 prev로 맞추고, 안되면 그냥 두기. (a[i]<prev면 return false)
<코드>
int n, m;
vector<int> a;
bool pos(int k) {
vector<int> b= a;
int p = 0;
for (int i = 0; i < n; i++) {
if (p > b[i]) {
if (p - b[i] > k) return false;
b[i] = p;
}
else {
if (m - b[i] + p <= k)
b[i] = p;
}
p = b[i];
}
return true;
}
int main() {
FAST; cin >> n >> m;
a.resize(n);
for (int i = 0; i < n; i++) cin >> a[i];
int lo = 0, hi = m;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (pos(mid)) hi = mid;
else lo = mid + 1;
}
cout << lo << '\n';
}
'알고리즘 > 코드포스' 카테고리의 다른 글
global round #7 D2 - Prefix-Suffix Palindrome (실패함수, prefix function) (0) | 2020.03.20 |
---|---|
cf 596 div2 D - Power products (소인수분해, 수학) (0) | 2020.03.15 |
cf 626 div2 D - present (수론, 이분탐색) (0) | 2020.03.15 |
cf 564 div2 D - Nauuo and circle (tree, graph dp) (0) | 2020.03.15 |
Codeforces #627 div3 F - Maximum white subtree (graph dp, reroot) (0) | 2020.03.14 |