Cod sursa(job #1750899)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 31 august 2016 14:02:24
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#define MAXN 18

using namespace std;

int g;

struct cost
{
    int cam, rest;
    cost(int cam, int rest) : cam(cam), rest(rest) { }
    cost(int rest = 0) : cam(0), rest(rest) { }
    bool operator<(const cost &e) const
    {
        if (this->cam != e.cam) return this->cam < e.cam;
        return this->rest < e.rest;
    }
    cost operator+(cost e)
    {
    	int c = cam + e.cam, re;
        long long r = 1LL*rest + e.rest;
        if (r > 1LL*g)
			re = e.rest, c++;
        else
			re = rest + e.rest;
		return cost(c, re);
    }
};
int n;
cost bl[MAXN];

void citire()
{
	scanf("%d %d", &n, &g);
    for (int i = 0; i < n; i++) {
        int t;
        scanf("%d", &t);
        bl[i] = cost(t);
    }
}
cost best[1<<MAXN];
void solve()
{
    best[0] = cost(0);
    for (int i = 1; i < (1<<n); i++) {
        int x = i;
        cost mini = cost(100, 100); // 100 cam > inf :D
        for (int j = 0; i>>j; j++) {
            if ((i>>j) & 1) {
                mini = min(mini, best[i ^ (1<<j)]+bl[j]);
            }
        }
        best[i] = mini;
    }
    printf("%d\n", best[(1<<n)-1].cam+1);
}

int main()
{
    freopen("zebughil.in", "r", stdin);
    freopen("zebughil.out", "w", stdout);

    int t = 3;
    while (t--) {
		citire();
		solve();
    }

    return 0;
}