您的位置:首页 > 其它

uva 11400 Lighting System Design(dp~)

2017-09-16 11:15 323 查看
这道题,被我拖了许久。。。

变量多的题看起来实在很复杂。。。

先说一下思路(反正我没想出来TAT)

题意:

一共有n种灯泡,不同种类的灯泡必须用不同种电源,但同一种灯泡可以用同一种电源。每种灯泡有四个参数:

电压值V、电源费用K、每个灯泡的费用C、所需该种灯泡的数量L

为了省钱,可以用电压高的灯泡来代替电压低的灯泡。输出最小费用。

分析:

每种电源的灯泡要么不换要么全换,因为只换部分的话,两种类型的电源都要买,不划算。

将电压从小到大排序,s[i]表示前i种灯泡一共需要多少个灯泡,d[i]表示前i种灯泡最少费用。

d[i] = min{d[j] + (s[i] - s[j]) * c[i] + k[i]} (j = 0,,,i-1) (表示前j种灯泡用最优解,第j+1~i 种都被第 i 种灯泡所替换而且用第i种电源)

//uva 11400
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <vector>
#define INF 0x3f3f3f3f

using namespace std;

struct node
{
int v, k, c, l;
bool operator<(const node &a) const
{
return v < a.v;
}

} a[10005];
int n, dp[100004], s[100005];

int main(void)
{
while (~scanf("%d", &n) && n)
{
memset(a, 0, sizeof(a));
memset(dp, 0, 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);

s[0] = 0;
for (int i = 1; i <= n; i++)
s[i] = s[i - 1] + a[i].l;

dp[1] = a[1].k + a[1].c * a[1].l;
for (int i = 1; i <= n; i++)
{
dp[i] = INF;
for (int j = 0; j < i; j++)
{
dp[i] = min(dp[i], dp[j] + (s[i] - s[j]) * a[i].c + a[i].k);
}
}

printf("%d\n", dp
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: