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

贪心活动安排,求错或者bt数据……

Posted by martinblack954 at 2009-07-27 22:58:00 on Problem 3038
#include "stdio.h"
#include <algorithm>
using namespace std;
#define M 50003

struct cow
{
	int s,e,m;
};
cow all1[M],all2[M],x;
int cmp(cow a,cow b)
{
	if(a.e!=b.e)
		return a.eb.e;
	else return a.s<b.s;
}
int cmp2(cow a,cow b)
{
	return !cmp(a,b);
}

int main()
{
	int k,n,c,i,j,n1,n2,total,p;
	//freopen("in.txt","r",stdin);
	while(scanf("%d%d%d",&k,&n,&c)>0)
	{
		n1=0;n2=0;
		for(i=0;i<k;i++)
		{
			scanf("%d%d%d",&x.s,&x.e,&x.m);
			if(x.s<x.e)
			{all1[n1]=x;n1++;}
			else {all2[n2]=x;n2++;}
		}
		sort(all1,all1+n1,cmp);
		sort(all2,all2+n2,cmp2);
		total=0;
		/*for(i=0;i<n1;i++)
			printf("%d %d %d\n",all1[i].s,all1[i].e,all1[i].m);
		printf("\n");
		for(i=0;i<n2;i++)
			printf("%d %d %d\n",all2[i].s,all2[i].e,all2[i].m);
		printf("\n");*/
		for(i=0;i<c;i++)
		{
			p=0;
			for(j=0;j<n1;j++)
			{
				if(all1[j].s>=p&&all1[j].m>0)
				{
					p=all1[j].e;all1[j].m--;
					total++;
				}
			}
		}
		for(i=0;i<c;i++)
		{
			p=n+1;
			for(j=0;j<n2;j++)
			{
				if(all2[j].s<=p&&all2[j].m>0)
				{
					p=all2[j].e;all2[j].m--;
					total++;
				}
			}
		}
		printf("%d\n",total);
	}
	return 0;
}


大致思路是:来回分开考虑,每一个座位单独考虑。all1数组存放“去”的,all2数组存放“回”的。具体实现时,两个数组分别按目的地排序,all1中早到达目的地的排在前,同时到达目的地时,起点早的排在前。all2排序规则相反。对于每一个座位,看从头走到尾,最多能搭多少只牛,同时,若一群牛已被“前面”的座位载走,则不考虑这群牛。如此重复c次。total做统计。回来时,对all2进行相反的操作,统计total。

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