题目描述
给出在同一条直线上的n个点和两个数A,B,现在要在这条直线上放置若干个信号塔,每个信号塔有一个r值,假设它的位置是x,则它能覆盖的范围是x-r~x+r,放置一个信号塔的花费是A+B*r,问要覆盖所有的点最小的花费是多少。
题意转化
在一条直线上有n个点,每个点x都可以覆盖坐标{x-r,x+r}的位置,但要花费代价v*r+v1,问如何使得总代价最小。
解题方法
使用dp数组进行转化。先利用sort函数进行排序
设第一维为灯塔的下标,第二维为灯塔的状态(未覆盖/覆盖)
则可以得到如下转换:
dp[i][0]=min(dp[i-1][0],dp[i-1][1])+b;//不覆盖灯塔的花费
dp[i][1]=min(dp[i-1][1]+c/2.0*(t[i]-t[i-1]),dp[i][0]);//覆盖灯塔的花费
全部代码
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int t[2007];double dp[2007][2];
int main(){
int a,b,c;
cin>>a>>b>>c;
for(int i=0;i<a;i++){
cin>>t[i];
}sort(t,t+a);
dp[0][0]=b;
dp[0][1]=b;
for(int i=1;i<a;i++){
dp[i][0]=min(dp[i-1][0],dp[i-1][1])+b;
dp[i][1]=min(dp[i-1][1]+c/2.0*(t[i]-t[i-1]),dp[i][0]);
}
if(dp[a-1][1]-0.1<floor(dp[a-1][1]))printf("%.0lf",dp[a-1][1]);
else printf("%.1lf",dp[a-1][1]);
return 0;
}