Cod sursa(job #443020)

Utilizator stefan.teleustefan teleu stefan.teleu Data 15 aprilie 2010 21:31:05
Problema Gutui Scor 10
Compilator cpp Status done
Runda teme_upb Marime 1.41 kb
#include<fstream>
#include<cstdlib>
#include<vector>
#include<algorithm>

using namespace std;



struct Gutui{
	unsigned long h;
	unsigned long w;
	int mark;
	bool operator() (Gutui a, Gutui b) { if (a.h==b.h) return (a.w<b.w); return (a.h<b.h); }
}gutui;

bool weigthcompare (Gutui a, Gutui b) { return (a.w < b.w);}

int main(){
	unsigned long n,h,u,u1=0,hmax=0,umax=0;
	
	ifstream fin ("gutui.in");
	ofstream fout ("gutui.out");
	fin>>n>>h>>u;
	Gutui max;
	vector<Gutui> g(n);	
	for (long i=0; i<n; i++)
		fin>>g[i].h>>g[i].w;
	for (long i=0; i<n; i++)
		{
		
		g[i].mark=0;
		}
	sort(g.begin(),g.end(),gutui);
	Gutui aux;
	for (long i=0; i<n/2; i++)
		{
		aux=g[i];
		g[i]=g[n-i-1];
		g[n-i-1]=aux;
		}
	long i=0;
	while (i<n)
		{
		if (g[i].h+u1 < h && g[i].mark == 0 && hmax<n)
			{	
			u1+=u;
			if (g[i].h+u1 == h)
				{
				umax+=g[i].w;
				//fout<<g[i].w<<endl;
				g[i].mark=1;
				
				i++;
				}
			
			else
				{
				max= *max_element(g.begin()+i,g.end(),weigthcompare);
				for (long j=i; j<n; j++)
					if (g[j].w==max.w && g[j].mark==0)
						{
						umax+=g[j].w;
						//fout<<g[j].w<<endl;
						g[j].mark=1;
						}
				}
			}
			else 
				{
				g[i].mark=1;
				i++;
				}			
		}
	//max= *max_element(g.begin()+5,g.end(),weigthcompare);
	//fout<<max.h<<" "<<max.w<<endl;
	//fout<<endl;
	//for (int i=0; i<n; i++)
	//	fout<<" "<<g[i].h<<" "<<g[i].w<<endl;
	fout<<umax<<endl;
	fin.close();
	fout.close();
	return 0;
}