Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:有人能给一下accept的原代码吗,十分感谢!

Posted by zhucheng at 2004-12-09 19:52:36 on Problem 1018
In Reply To:有人能给一下accept的原代码吗,十分感谢! Posted by:zeus at 2004-04-22 12:09:42
> 有人能给一下accept的原代码吗,十分感谢!
枚举width的下界,每次贪心计算最优,然后求得到全局最优
AC code
应该还可以优化。
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int width[10000];
int top;

struct man
{
	int price,width;
};

struct node
{
	man value;
	node* next;
	node():next(NULL){};
};

node *head[100];
void init()
{
	int i;
	for(i=0;i<100;i++)
	{
		head[i]=new node();
	}
}

void clear(int n)
{
	node* dp;
	int i;
	for(i=0;i<n;i++)
	{
		dp=head[i]->next;
		while(dp!=NULL)
		{
			head[i]->next=dp->next;
			delete dp;
			dp=head[i]->next;
		}
	}
}



inline int cmp(const man& m1,const man& m2)
{
	if(m1.price<=m2.price&&m1.width>=m2.width)
		return 1;
	if(m2.price<=m1.price&&m2.width>=m1.width)
		return -1;
	return 0;
}

inline bool cmp1(const man& m1,const man& m2)
{
	return m1.width*m2.price>m1.price*m2.width;
}

bool cmp2(int a,int b)
{
	return a>b;
}


void insert(const man& in,int index)
{
	node *sp,*pre;
	int c;
	bool inser=true;
	pre=head[index];
	sp=pre->next;
	while(sp!=NULL)
	{
		c=cmp(in,sp->value);
		if(c==1)
		{
			pre->next=sp->next;
			delete sp;
			sp=pre->next;
		}
		else if(c==-1)
		{
			inser=false;
			break;
		}
		else
		{
			pre=sp;
			sp=sp->next;
		}
	}
	if(inser)
	{
		sp=head[index]->next;
		pre=head[index];
		while(sp!=NULL&&sp->value.price<in.price)
		{
			pre=sp;
			sp=pre->next;
		}
		pre->next=new node();
		pre=pre->next;
		pre->value.price=in.price;
		pre->value.width=in.width;
		pre->next=sp;
	}
}



int read(int n)
{
	int i,j,m;
	int maxrow,minmaxrow=0x7fffffff;
	man readin;
	top=0;
	for(i=0;i<n;i++)
	{
		cin>>m;
		maxrow=0;
		for(j=0;j<m;j++)
		{
			cin>>readin.width>>readin.price;
			width[top++]=readin.width;
			maxrow=max(readin.width,maxrow);
			insert(readin,i);
		}
		minmaxrow=min(minmaxrow,maxrow);
	}
	sort(width,width+top,cmp2);
	return minmaxrow;
}


int findminprice(int index,int boundwidth)
{
	node* sp=head[index]->next;
	while(sp->value.width<boundwidth)
	{
		sp=sp->next;
	}
	return sp->value.price;
}


int findmax(int boundwidth,int n)
{
	int allprice=0;
	int i;
	for(i=0;i<n;i++)
	{
		allprice+=findminprice(i,boundwidth);
	}
	return allprice;
}

int main()
{
	int test,n,boundw,nextindex;
	man currentman,minman;
	cin>>test;
	init();
	while(test>0)
	{
		test--;
		cin>>n;
		boundw=read(n);
		minman.width=boundw;
		minman.price=findmax(boundw,n);
		nextindex=0;
		while(width[nextindex]!=boundw)
			nextindex++;
		while(nextindex<top&&width[nextindex]==boundw)
			nextindex++;
		while(nextindex<top)
		{
			boundw=width[nextindex];
			currentman.width=boundw;
			currentman.price=findmax(boundw,n);
			if(cmp1(currentman,minman))
			{
				minman.price=currentman.price;
				minman.width=currentman.width;
			}
			while(nextindex<top&&width[nextindex]==boundw)
				nextindex++;
		}
		clear(n);
		cout<<fixed<<setprecision(3)<<(double)minman.width/(double)minman.price<<endl;
	}
	return 0;
}







Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator