https://www.acmicpc.net/problem/25386
라즈베리의 원형배열을 일차원 배열처럼 생각합니다. 배정한 라즈베리 파이의 순서를 유지하는 한, 일차원 배열을 계속 확장할 수 있습니다.
a,b 배열을 pair로 묶고 b를 기준, 오름차순으로 정렬했습니다.
#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
const char en = '\n';
const int INF = (int)1e9 + 7;
const int mod = (int)1e9 + 7;
bool cmp(pair<ll, ll> a, pair<ll, ll> b) {
if (a.second == b.second) return a.first < b.first;
return a.second < b.second;
}
int main(void) {
fast;
int m, n; cin >> m >> n;
vector<pair<ll, ll>> a(n);
for (int i = 0; i < n; ++i) cin >> a[i].first;
for (int i = 0; i < n; ++i) cin >> a[i].second;
if (m == n) {
for (int i = 0; i < n; ++i) {
if (a[i].first != a[i].second) {
cout << -1 << en; return 0;
}
}
cout << 0 << en; return 0;
}
sort(a.begin(), a.end(), cmp);
for (int i = 0; i < n - 1; ++i) {
if (a[i].second == a[i + 1].second) {
cout << -1 << en; return 0;
}
}
ll ans = 0, cnt = 0;
for (int i = 0; i < n - 1; ++i) {
if (a[i].first > a[i + 1].first) {
double ce = ceil(((double)a[i].first - (double)a[i + 1].first) / (double)m)*(double)m;
a[i + 1].first += ce;
}
}
for (int i = 0; i < n; ++i) {
if (a[i].first + (cnt*m) < a[i].second) {
cnt += 1;
}
}
for (int i = 0; i < n; ++i) a[i].first += cnt * m;
if (a.front().first + m <= a.back().first) {
cout << -1 << en; return 0;
}
for (int i = 0; i < n; ++i) ans += a[i].first - a[i].second;
cout << ans << en;
return 0;
}
예제에 관한 풀이 그림 첨부
순서대로 입력 예제 1,2 입니다.
라즈베리 배열은 원래 원형 배열이므로, 정렬된 a 배열의 마지막 조각은 처음 a 조각 + M 보다 크거나 같아야 합니다. ( if(a.front().first + m <= a.back().first 부분입니다.)
참가자에게 배정한 파이 조각 위치는 참가자가 원하는 파이 조각의 번호보다 커야합니다.