UVA 11400 Lighting System Design

#include<stdio.h>
#include<string.h>
#include<algorithm>
///题解在下面
using namespace std;
#define N 100005
#define inf 0x3f3f3f3f
int dp[N];
struct data
{
    int v,k,c,l;///电压  电源费用  灯泡费用  数量
    friend bool operator <(data a,data b)
    {
        return a.v<b.v;
    }
} a[N];
int num[N];
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        memset(dp,inf,sizeof(dp));
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d%d%d",&a[i].v,&a[i].k,&a[i].c,&a[i].l);
        }
        sort(a+1,a+1+n);
        num[0]=0;
        for(int i=1; i<=n; i++)
        {
            num[i]=num[i-1]+a[i].l;
        }
        dp[1]=0;
        for(int i=1; i<=n; i++)
        {
            dp[i]=num[i]*a[i].c+a[i].k;
            for(int j=0; j<i; j++)
            {
                dp[i]=min(dp[i],dp[j]+(num[i]-num[j])*a[i].c+a[i].k);
            }
        }
        printf("%d\n",dp[n]);
    }
}
 


以上是AC 代码。


对电压进行排序


存储每一种从前到后每一种灯泡所需要的数量和


dp[i] 是指  1 - i 灯泡安排完成的最少花费。


替换的时候从 j - i 全部替换成 灯泡 i 然后+ dp【i-1】


询问:会不会漏情况?

答案 : 不会的。

证明:

假设我们用4 替换 1 3 比 替换 1 2 3 划算

也就是 现在已经替换 2 的灯泡(或者是他本身)比 4 的价值更低。

但是 1 的价值要比 4 的高。

但是 1 2 已经完成过替换了

所以 2 的价值 > = 1 的价值

所以我们一开始的假设不成立


所以啦不会漏情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值