UVA 301 Transportation
2011-09-05 01:13
399 查看
UVA_301[/b]
我们可以取一个数组p来记录列车到每一站时最多能容纳的乘客量,之后对输入的数据按起始车站升序排列,然后按顺序枚举每一个订单。如果当前订单的乘客量小于或等于列车到该站时能容纳的乘客量,则该订单可以被接受,更新p并进行递归即可。
我们可以取一个数组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; }
相关文章推荐
- uva 301 Transportation(回溯)
- UVA 301 - Transportation
- UVA 301 Transportation
- uva 301 Transportation 铁路公司的阳谋 纯dfs暴力
- uva 301 Transportation (DFS)
- uva 301 Transportation(回溯)
- uva 301 - Transportation
- UVa 301 - Transportation
- Transportation uva 301 为什么错了?
- uva 301 - Transportation
- uva 301 Transportation
- uva 301 - Transportation
- UVA 301 Transportation
- ( 回溯 )uva 301 - Transportation
- UVa 301 - Transportation
- UVA 301 Transportation 。。有点需要思考的回溯、、
- uva301 - Transportation
- uva 301 - Transportation
- uva 301 Transportation 铁路公司的阳谋 纯dfs暴力
- Uva 301 - Transportation