#include "festival.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
const int LIM = 20;
long long dp[MAXN][LIM + 1];
int n,init;
long long p[MAXN],t[MAXN];
bool cmp(int i, int j)
{
if(t[i] == 1 && t[j] == 1)
return p[i] < p[j];
if(t[i] == 1)
return 0;
if(t[j] == 1)
return 1;
return p[i] * t[i] * (t[j] - 1) < p[j] * t[j] * (t[i] - 1);
}
std::vector<int> max_coupons(int copA, std::vector<int> P, std::vector<int> T)
{
long long A = copA;
n = P.size();
for(int i=0;i<n;i++)
{
p[i] = P[i];
t[i] = T[i];
}
init = A;
vector<int> ord;
for(int i=0;i<n;i++)
ord.push_back(i);
sort(ord.begin(),ord.end(),cmp);
vector<int> sol,ramase;
for(int i:ord)
{
if((A - p[i]) * t[i] >= A)
{
sol.push_back(i);
A = (A - p[i]) * t[i];
}
else
ramase.push_back(i);
}
for(int cnt=0;cnt<=LIM;cnt++)
dp[0][cnt] = -1;
dp[0][0] = A;
for(int i=0;i<ramase.size();i++)
{
int myt = t[ramase[i]], myp = p[ramase[i]];
dp[i+1][0] = A;
for(int cnt=1;cnt<=LIM;cnt++)
{
dp[i+1][cnt] = max(dp[i][cnt], (dp[i][cnt-1] - myp) * myt);
}
}
long long cur=0;
for(int cnt=0;cnt<=LIM;cnt++)
if(dp[(int)ramase.size()][cnt] >= 0)
cur = cnt;
vector<int> aux;
for(int i=(int)ramase.size()-1;i>=0;i--)
{
if(dp[i+1][cur] == dp[i][cur])
{
}
else
{
aux.push_back(ramase[i]);
cur--;
}
}
assert(cur == 0);
reverse(aux.begin(), aux.end());
for(int x:aux) sol.push_back(x);
return sol;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |