# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1017828 | nickolasarapidis | 카니발 티켓 (IOI20_tickets) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*
IOI 2020
Day 1 - problem 3 (tickets)
Author: Nickolas Arapidis
*/
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F first
#define S second
#define make_pair MP
ll calculate_score(vector<int> A){
int N = A.size();
ll sum = 0;
int mid = A[N/2];
for(int i = 0; i < N; i++){
sum += abs(A[i] - mid);
}
return sum;
}
ll find_maximum(int k, vector<vector<int>> X){
ll ans = 0;
int N = X.size(); // Ammount of colors
int M = X[0].size(); // Ammount of tickets for each color
vector<int> s(M, -1);
vector<vector<int>> S(N, s);
vector<int> large;
vector<int> small;
vector<int> A;
vector<pair<int, int> > B(N, {0, 0});
for(int i = 0; i < k; i++){
large.clear();
small.clear();
A.clear();
map<int, pair<int, int> > l;
map<int, pair<int, int> > s;
for(int j = 0; j < N; j++){
large.push_back(X[j][(M - 1) - B[j].S]);
small.push_back(X[j][0 + B[j].F]);
l[large.back()] = MP(j, (M - 1) - B[j].S);
s[small.back()] = MP(j, 0 + B[j].F);
}
sort(large.begin(), large.end());
sort(small.begin(), small.end());
for(int j = 0; j < N/2; j++){
A.push_back(small[j]);
S[s[A.back()].first][s[A.back()].second] = i;
}
for(int j = N/2; j < N; j++){
A.push_back(large[j]);
S[l[A.back()].first][l[A.back()].second] = i;
}
ans += calculate_score(A);
}
allocate_tickets(S);
return ans;
}