Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- #include<algorithm>
- using namespace std;
- void go(int &ans, int &p, int now, int pr){
- if (ans < now){
- ans = now;
- p = pr;
- }
- }
- int main (){
- int n, best;
- cin >> n;
- vector < int > ans[3];
- int t[n + 1][3][4][6];
- int p[n + 1][3][4][6];
- int v[n][3];
- int num[n];
- for(int i = 0; i < n; i++) cin >> v[i][0] >> v[i][1] >> v[i][2];
- vector < int > take;
- vector < pair < int, int > > buf;
- for(int i = 0; i < 3; i++){
- for(int j = 0; j < n; j++) buf.push_back({v[j][i], j});
- sort(buf.rbegin(), buf.rend());
- for(int j = 0; j < 10; j++) take.push_back(buf[j].second);
- buf.clear();
- }
- sort(take.begin(), take.end());
- take.erase(unique(take.begin(), take.end()), take.end());
- for(int i = 0; i < take.size(); i++){
- for(int j = 0; j < 3; j++) v[i][j] = v[take[i]][j];
- num[i] = take[i];
- }
- n = take.size();
- memset(t, 255, sizeof t);
- memset(p, 255, sizeof p);
- t[0][0][0][0] = 0;
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < 3; j++) {
- for(int k = 0; k < 4; k++) {
- for(int l = 0; l < 6; l++){
- go(t[i+1][j][k][l], p[i+1][j][k][l], t[i][j][k][l], -1);
- if (j + 1 <= 2) go(t[i+1][j+1][k][l], p[i+1][j+1][k][l], t[i][j][k][l] + v[i][2], 2);
- if (k + 1 <= 3) go(t[i+1][j][k+1][l], p[i+1][j][k+1][l], t[i][j][k][l] + v[i][1], 1);
- if (l + 1 <= 5) go(t[i+1][j][k][l+1], p[i+1][j][k][l+1], t[i][j][k][l] + v[i][0], 0);
- }
- }
- }
- }
- best = t[n][2][3][5];
- int j = 2, k = 3, l = 5;
- for(int i = n - 1; i > -1; i--){
- int now = p[i + 1][j][k][l];
- if (now == -1) continue;
- ans[now].push_back(num[i]);
- if (now == 0) l--;
- if (now == 1) k--;
- if (now == 2) j--;
- }
- for(int i = 0; i < 3; i++) {
- for(int j = 0; j < ans[i].size(); j++) cout << ans[i][j] + 1 << " ";
- cout << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement