Cod sursa(job #1941755)

Utilizator borcanirobertBorcani Robert borcanirobert Data 27 martie 2017 16:13:59
Problema Balans Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <fstream>
#include <cstring>
using namespace std;

ifstream fin("provacanta.in");
ofstream fout("provacanta.out");

const int MAXNM = 110;
const int MAXK = 1005;
struct Activitate{
    int t, p;
};
int T, N, M, K;
Activitate p[MAXNM], v[MAXNM];
int Dp[MAXK][MAXNM];
int Dv[MAXK][MAXNM];
int pmax;

void ReadTest();
void Solve();

int main()
{
    fin >> T;

    while ( T-- )
    {
        ReadTest();
        Solve();
    }

    fin.close();
    fout.close();
    return 0;
}

void ReadTest()
{
    int i;

    fin >> N >> M >> K;
    for ( i = 1; i <= N; i++ )
        fin >> p[i].t >> p[i].p;
    for ( i = 1; i <= M; i++ )
        fin >> v[i].t >> v[i].p;
}

void Solve()
{
    memset(Dp, -1, sizeof(Dp));
    memset(Dv, -1, sizeof(Dv));

    int i, j, k, zp;

    Dp[0][0] = 0;
    for ( k = 1; k <= N; k++ )
    {
        for ( i = K; i >= 0; i-- )
        {
        //    if ( k == N && i == 1 )
         //       fout << "DA\n";

            for ( j = 0; j < N; j++ )
                if ( Dp[i][j] != -1 && i + p[k].t <= K )
                    Dp[i + p[k].t][j + 1] = max( Dp[i + p[k].t][j + 1], Dp[i][j] + p[k].p );
        }
    }

    Dv[0][0] = 0;
    for ( k = 1; k <= M; k++ )
    {
        for ( i = K; i >= 0; i-- )
            for ( j = 0; j < M; j++ )
                if ( Dv[i][j] != -1 && i + v[k].t <= K )
                    Dv[i + v[k].t][j + 1] = max( Dv[i + v[k].t][j + 1], Dv[i][j] + v[k].p );
    }

    for ( i = 1; i <= K; i++ )
        for ( j = 0; j <= N; j++ )
            Dv[i][j] = max( Dv[i][j], Dv[i - 1][j] );

   /* for ( i = 0; i <= K; i++ )
    {
        fout << "Ziua: " << i << "  ";
        for ( j = 0; j <= N; j++ )
            fout << Dp[i][j] << ' ';
        fout << '\n';
    }
    fout << '\n';
    for ( i = 0; i <= K; i++ )
    {
        fout << "Ziua: " << i << "  ";
        for ( j = 0; j <= N; j++ )
            fout << Dv[i][j] << ' ';
        fout << '\n';
    }
    */
    for ( i = 1; i <= K; i++ )
    {
        for ( j = 1; j <= N; j++ )
        {
            for ( k = 0; k <= M; k++ )
            {
              //  if ( i == 6 && j ==  )
                k++;
                if ( k >= j ) zp = 0;
                else
                    if ( j % k == 0 )
                    {
                        zp = (( j / k ) - 1);
                        zp = k*( zp * ( zp + 1 ) / 2 );
                    }
                    else
                    {
                        int r = j % k;
                        zp = (( j / k ) - 1);
                        zp = k*( zp * ( zp + 1 ) / 2 );
                        zp += r * ( j / k );
                    }
                k--;

                int zt = zp + i;

                if ( K - zt >= 0 && Dv[K - zt][k] != -1 )
                    pmax = max( pmax, Dp[i][j] + Dv[K - zt][k] );
            }
        }
    }

    fout << pmax << '\n';
    pmax = 0;
}