UVA_301

    我们可以取一个数组p来记录列车到每一站时最多能容纳的乘客量,之后对输入的数据按起始车站升序排列,然后按顺序枚举每一个订单。如果当前订单的乘客量小于或等于列车到该站时能容纳的乘客量,则该订单可以被接受,更新p并进行递归即可。

#include<string.h>
#include
<stdio.h>
#include
<stdlib.h>
int n,d,s,ans;
int begin[30],end[30],num[30],r[30];
int cmp(const void *_p,const void *_q)
{
int *p=(int *)_p;
int *q=(int *)_q;
return begin[*p]-begin[*q];
}

int dfs(int cur,int p[],int tot)
{
int i,j,t,q[30];
for(i=cur;i<d;i++)
if(num[r[i]]<=n-p[begin[r[i]]])
{
for(j=0;j<30;j++)
q[j]
=p[j];
for(j=begin[r[i]];j<end[r[i]];j++)
q[j]
+=num[r[i]];
t
=tot+(end[r[i]]-begin[r[i]])*num[r[i]];
dfs(i
+1,q,t);
}
if(i==d&&tot>ans)
ans
=tot;
}
int main()
{
int i,j,k,p[30],tot;
while(1)
{
scanf(
"%d%d%d",&n,&s,&d);
if(n==0)
break;
for(i=0;i<d;i++)
scanf(
"%d%d%d",&begin[i],&end[i],&num[i]);
for(i=0;i<d;i++)
r[i]
=i;
qsort(r,d,
sizeof(r[0]),cmp);
ans
=0;
for(i=0;i<d;i++)
if(num[r[i]]<=n)
{
memset(p,
0,sizeof(p));
for(j=begin[r[i]];j<end[r[i]];j++)
p[j]
+=num[r[i]];
tot
=(end[r[i]]-begin[r[i]])*num[r[i]];
dfs(i
+1,p,tot);
}
printf(
"%d\n",ans);
}
return 0;
}

  

posted on 2011-09-05 01:13  Staginner  阅读(345)  评论(0编辑  收藏  举报