제출 #1198689

#제출 시각아이디문제언어결과실행 시간메모리
1198689Gr1senBoxes with souvenirs (IOI15_boxes)C++20
0 / 100
11 ms324 KiB
#include "boxes.h" #include<algorithm> #include<iomanip> #include<vector> #include<set> #include<iterator> #include<iostream> using namespace std; #define ll long long #define vi vector<ll> #define vvi vector<vi> #define ms multiset<int> ms M; int glt, grt; int k, n, l; ll ans; ll oink(int le = 1) { ans = 0; int lt = glt, rt = grt; auto it = M.begin(); int re = n%k-le; if (le != 0) { advance(it, le-1); ans += 2*(*it); lt -= le; it++; } while (lt >= k) { advance(it, k-1); ans += 2*(*it); lt -= k; it++; } it = M.end(); if (re != 0) { advance(it, -re); ans += 2*(*it); rt -= re; } while (rt >= k) { advance(it, -k); ans += 2*(l-(*it)); rt -= k; } if (lt == 0 && rt == 0) return ans; //cerr << "oink ans : " << ans + l << endl; return ans + l; } ll oinkoink() { ans = 0; auto it = M.begin(); advance(it, glt); auto it1 = it; it++; auto it2 = it; while (distance(M.begin(), it1) >= k) { ans += 2*(*it1); advance(it1, -k); } ans += 2*(*it1); while (distance(it2, M.end()) > k) { ans += 2*(*it2); advance(it2, -k); } ans += 2*(l-(*it2)); return ans; } ll delivery(int in, int ik, int il, int p[]) { k = ik; n = in; l = il; ans = 0; M.clear(); int lh = l/2; for (int i = 0; i < n; i++) { M.insert(p[i]); if (p[i] <= lh) glt++; else grt++; } ll best = oinkoink(); //cerr << "best no circle : " << best << endl; for (int i = 1; i < k; i++) { best = min(best, oink(i)); //cerr << "best: " << best << endl; } return best; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...