17098 广告牌最佳安放问题
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
有一条路从西向东M公里,是一段旅行的公路。 在这段公路上放置n块广告牌,广告牌的地点:x1,x2,...,xn。 如果你放一块广告牌在地点xi,就能获得ri的收益(ri>0)。 该地公路局规定:两块广告牌不能小于或等于5公里。 现在请你挑选并安排这些广告牌放置地点,使得你的总收益在公路局规定的限制下达到最大。
输入格式
第一行:公路长度M,广告牌的总数n,中间空格。(M<100000, n<M) 第二行:广告牌安置地点向量:x1 x2 ... xn 第三行:广告牌安置收益向量:r1 r2 ... rn
输出格式
第一行:最大总收益。
输入样例
20 4 6 7 12 14 5 6 5 1
输出样例
10 解释:这里指挑选1和3号广告牌是效益最优(总效益为10)且符合公路局规定的方案。
提示
定义符号: 广告牌安置地点向量:x1 x2 ... xn 广告牌安置收益向量:r1 r2 ... rn 假设d[i]表示:从西向东到第i个广告牌地点xi处,可选择放置广告牌的最大效益值。 (1)i=1时,d[1]=r1; (2)i>1时,d[i]=max{d[i-1],d[j]+ri | for all possible j, 1<=j<=i && si-sj>5 } d[n]就是原问题所求的符合公路局规定的最大广告效益和。
我的代码实现:
#include<stdio.h> #define N 100005 int d[N]; //(1)i=1时,d[1]=r1; //(2)i>1时,d[i]=max{d[i-1],d[j]+ri | for all possible j, 1<=j<=i && si-sj>5 } // // int max(int x,int y){ return x>y?x:y; } void ff(int *x,int *r,int n){ d[1]=r[1]; int maxx; for(int i=2;i<=n;i++){ maxx=0;//记录d[j]+ri的最大值 for(int j=1;j<=i;j++){//此处maxx不能从d[1]+ri开始,因为会误导后面max()的判断。以及j应该从1开始,不要从2开始 if((x[i]-x[j]>5)&&(maxx<d[j]+r[i])) maxx=d[j]+r[i]; } d[i]=max(d[i-1],maxx); } } int main(){ int x[N],r[N]; int n,m; scanf("%d %d",&m,&n); for(int i=1;i<=n;i++){ scanf("%d",&x[i]); } for(int i=1;i<=n;i++){ scanf("%d",&r[i]); } ff(x,r,n); printf("%d ",d[n]); return 0; }