Cod sursa(job #1350027)

Utilizator matei_cChristescu Matei matei_c Data 20 februarie 2015 16:58:58
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
using namespace std ;

#define maxn 100005

int N, M ;

struct camion
{
    int c, t ;
};

camion cam[maxn] ;

int cat_duce[maxn] ;

int cate, sol ;

bool ok(int timp)
{
    int ramas = M ;

    for(int i = 1; i <= N; ++i)
    {
        if( ramas <= cam[i].c * ( timp / cam[i].t ) )
            return true ;

        ramas -= cam[i].c * ( timp / cam[i].t ) ;
    }

    return false ;
}

int main()
{
	std::ios_base::sync_with_stdio(false) ;

	freopen("garaj.in", "r", stdin);
	freopen("garaj.out", "w", stdout);

    cin >> N >> M ;

    for(int i = 1; i <= N; ++i)
    {
        cin >> cam[i].c >> cam[i].t ;

        cam[i].t *= 2 ;
    }

    int st = 0, dr = ( 1 << 30 ) ;

    while( st <= dr )
    {
        int mij = ( st + dr ) >> 1 ;

        if( ok(mij) == true )
        {
            sol = mij ;
            dr = mij - 1 ;
        }
        else
            st = mij + 1 ;
    }

    for(int i = 1; i <= N; ++i)
    {
        int kt = cam[i].c * ( sol / cam[i].t ) ;

        cat_duce[i] = kt ; ;
    }

    sort( cat_duce + 1, cat_duce + N + 1 ) ;

    int ramas = M ;

    for(int i = N; i > 0; --i)
    {
        if( ramas <= 0 )
            break ;

        ramas -= cat_duce[i] ;
        ++cate ;
    }

    cout << sol << " " << cate ;

	return 0 ;
}