P3062 [USACO12DEC] Wifi Setup S 题解

题目描述

给出在同一条直线上的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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值