Cod sursa(job #1504480)

Utilizator mariakKapros Maria mariak Data 17 octombrie 2015 19:44:55
Problema Carnati Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <algorithm>
#define Dim 2002

using namespace std;
int n, Sol = -(1 << 30), s, c, dp[2][Dim];
struct nod
{
    int t;
    int p;
}v[Dim];
bool cmp(const nod a, const nod b)
{
    return a.t < b.t;
}
void read()
{
    freopen("carnati.in", "r", stdin);
    freopen("carnati.out", "w", stdout);
    scanf("%d %d", &n, &c);
    for(int i = 1; i <= n; ++ i)
        scanf("%d %d", &v[i].t, &v[i].p);
}
void solve()
{
    int i, j;
    sort(v + 1, v + n + 1, cmp);
    for(i = 1; i <= n; ++ i)
    {
        dp[0][i] = v[i].p - c;
        for(j = i - 1, s = v[i].p; j >= 1; -- j)
        {
            if(v[j].p >= v[i].p)
                s += v[i].p;
            dp[0][i] = max(dp[0][i], s - (v[i].t - v[j].t + 1) * c);
        }
        for(j = i + 1, s = 0; j <= n; ++ j)
        {
            if(v[j].p >= v[i].p)
                s += v[i].p;
            dp[1][i] = max(dp[1][i], s - (v[j].t - v[i].t) * c);

        }
        Sol = max(Sol, dp[0][i] + dp[1][i]);
    }
}
void write()
{
    printf("%d\n", Sol);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}