Submission #897838

#TimeUsernameProblemLanguageResultExecution timeMemory
897838alexddCloud Computing (CEOI18_clo)C++17
100 / 100
375 ms2644 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
struct event
{
    int tip;///1 - calculator
            ///2 - oferta
    int c;
    int f;
    int v;
};
bool cmp(event x, event y)
{
    if(x.f > y.f)
        return 1;
    if(x.f < y.f)
        return 0;
    if(x.tip==1 && y.tip==2)
        return 1;
    if(x.tip==2 && y.tip==1)
        return 0;
    return 0;
}
int n,m;
int dp[100005];
int newdp[100005];
vector<event> events;
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    event aux;
    for(int i=0;i<n;i++)
    {
        cin>>aux.c>>aux.f>>aux.v;
        aux.tip = 1;
        events.push_back(aux);
    }
    cin>>m;
    for(int i=0;i<m;i++)
    {
        cin>>aux.c>>aux.f>>aux.v;
        aux.tip = 2;
        events.push_back(aux);
    }
    sort(events.begin(),events.end(),cmp);
    int maxc=0;
    for(auto e:events)
    {
        if(e.tip==2)
        {
            for(int j=0;j<=maxc;j++)
            {
                newdp[j] = dp[j];
                if(j+e.c <= maxc) newdp[j] = max(newdp[j], dp[j+e.c] + e.v);
            }
        }
        else
        {
            for(int j=maxc+1;j<=maxc+e.c;j++)
                dp[j] = -INF;
            maxc += e.c;
            for(int j=0;j<=maxc;j++)
            {
                newdp[j] = dp[j];
                if(j>=e.c) newdp[j] = max(newdp[j], dp[j-e.c] - e.v);
            }
        }
        for(int j=0;j<=maxc;j++)
            dp[j] = newdp[j];
    }
    int mxm=0;
    for(int i=0;i<=maxc;i++)
        mxm = max(mxm, dp[i]);
    cout<<mxm;
    return 0;
}
/**
sortam ofertele si calculatoarele descrescator dupa f (daca un calculator si o oferta au acelasi f, calculatorul o sa fie primu in ordine)
dp[i][j] = profitul maxim daca din calculatoarele & ofertele cu pozitia in ordine <= i am ales unele a.i. sa avem j core-uri cumparate dar nefolosite

newdp[j] max= dp[j]

daca pe pozitia i avem o oferta:
newdp[j] max= dp[j+c] + v


daca pe pozitia i avem un calculator:
newdp[j] max= dp[j-c] - v


*/
#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...