제출 #1251799

#제출 시각아이디문제언어결과실행 시간메모리
1251799aryan12Festival (IOI25_festival)C++20
5 / 100
1186 ms2162688 KiB
#include "festival.h" #include <bits/stdc++.h> using namespace std; std::vector<int> max_coupons(int A, std::vector<int> P, std::vector<int> T) { vector<array<long long, 2> > coupons[5]; coupons[1].push_back({0LL, 0LL}); coupons[2].push_back({0LL, 0LL}); coupons[3].push_back({0LL, 0LL}); coupons[4].push_back({0LL, 0LL}); int n = P.size(); for(int i = 0; i < n; i++) { coupons[T[i]].push_back({P[i], i}); } sort(coupons[1].begin(), coupons[1].end()); sort(coupons[2].begin(), coupons[2].end()); sort(coupons[3].begin(), coupons[3].end()); sort(coupons[4].begin(), coupons[4].end()); long long one_siz = coupons[1].size(); long long two_siz = coupons[2].size(); long long three_siz = coupons[3].size(); long long four_siz = coupons[4].size(); long long dp[one_siz][two_siz][three_siz][four_siz]; for(long long i = 0; i < one_siz; i++) { for(long long j = 0; j < two_siz; j++) { for(long long k = 0; k < three_siz; k++) { for(long long l = 0; l < four_siz; l++) { dp[i][j][k][l] = -1; } } } } dp[0][0][0][0] = A; for(long long i = 0; i < one_siz; i++) { for(long long j = 0; j < two_siz; j++) { for(long long k = 0; k < three_siz; k++) { for(long long l = 0; l < four_siz; l++) { if(i != 0) { dp[i][j][k][l] = max(dp[i][j][k][l], (dp[i - 1][j][k][l] - coupons[1][i][0]) * 1LL); } if(j != 0) { dp[i][j][k][l] = max(dp[i][j][k][l], (dp[i][j - 1][k][l] - coupons[2][j][0]) * 2LL); } if(k != 0) { dp[i][j][k][l] = max(dp[i][j][k][l], (dp[i][j][k - 1][l] - coupons[3][k][0]) * 3LL); } if(l != 0) { dp[i][j][k][l] = max(dp[i][j][k][l], (dp[i][j][k][l - 1] - coupons[4][l][0]) * 4LL); } } } } } long long ii = 0, jj = 0, kk = 0, ll = 0; long long cur_val = A; for(long long i = 0; i < one_siz; i++) { for(long long j = 0; j < two_siz; j++) { for(long long k = 0; k < three_siz; k++) { for(long long l = 0; l < four_siz; l++) { if(ii + jj + kk + ll < i + j + k + l && dp[i][j][k][l] != -1) { ii = i; jj = j; kk = k; ll = l; cur_val = dp[i][j][k][l]; } else if(ii + jj + kk + ll == i + j + k + l && dp[i][j][k][l] > cur_val) { ii = i; jj = j; kk = k; ll = l; cur_val = dp[i][j][k][l]; } } } } } vector<int> ans; while(ii != 0 || jj != 0 || kk != 0 || ll != 0) { if(ii != 0 && (dp[ii - 1][jj][kk][ll] - coupons[1][ii][0]) * 1LL == dp[ii][jj][kk][ll]) { ans.push_back(coupons[1][ii][1]); ii--; continue; } if(jj != 0 && (dp[ii][jj - 1][kk][ll] - coupons[2][jj][0]) * 2LL == dp[ii][jj][kk][ll]) { ans.push_back(coupons[2][jj][1]); jj--; continue; } if(kk != 0 && (dp[ii][jj][kk - 1][ll] - coupons[3][kk][0]) * 3LL == dp[ii][jj][kk][ll]) { ans.push_back(coupons[3][kk][1]); kk--; continue; } if(ll != 0 && (dp[ii][jj][kk][ll - 1] - coupons[4][ll][0]) * 4LL == dp[ii][jj][kk][ll]) { ans.push_back(coupons[4][ll][1]); ll--; continue; } } reverse(ans.begin(), ans.end()); return ans; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...