UVa 11400 照明系统设计

时间:2023-03-09 19:48:34
UVa 11400 照明系统设计

https://vjudge.net/problem/UVA-11400

题意:

有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L。注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代。为了节约成本,你将设计一种系统,使之最便宜。

思路:

这道题和我之前做的POJ 1260(具体也可以看一下这题) 基本上是一样的,首先是按电压排序,设sum[i]为前i种灯泡的总数量,d[i]为灯泡1~i的最小开销,则d[i]=min{d[j]+(sum[i]-sum[j])*c[i]+k[i])},表示前j个先用最优方案买,然后第j+1~i个都用第i号的电源。答案为d[n]。

 #include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int maxn = + ; int n;
int d[maxn];
int sum[maxn]; struct node
{
int v, k, c, l;
}a[maxn]; bool cmp(node a, node b)
{
return a.v < b.v;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (cin >> n && n)
{ for (int i = ; i <= n; i++)
{
cin >> a[i].v >> a[i].k >> a[i].c >> a[i].l;
}
sort(a + , a + n + , cmp); sum[] = ;
for (int i = ; i <= n; i++) {
sum[i] = sum[i - ] + a[i].l;
}
d[] = ;
for (int i = ; i <= n; i++) {
d[i] = d[i - ] + a[i].c*a[i].l + a[i].k; //未优化之前的购买方式
for (int j = ; j < i; j++) {
d[i] = min(d[i], d[j] + (sum[i] - sum[j]) * a[i].c + a[i].k);
}
}
cout << d[n] << endl;
}
return ;
}