1. 程式人生 > >【UVa11400】照明系統設計

【UVa11400】照明系統設計

lib con emp 輸入 題解 fine spa ret scan

題目描述

設計某個地方的照明系統 ,一共需要n種不同類型的燈泡 。接著輸入每種燈泡的電壓v ,對應電壓電源的價格k ,每個燈泡的價格c ,需要這種燈泡的數量l 。電壓低的燈泡可以用電壓高的燈泡替換 , 每種燈泡只需要一個對應的電源 。求完成這個照明系統的最少花費。
輸入

有多組數據。
輸出

最小花費。
樣例輸入

3

100 500 10 20

120 600 8 16

220 400 7 18

0


樣例輸出

778



題解

設dp[ i ] 為買前 i 中燈泡的最小花費。 狀態轉移方程: dp[ i ] = min { dp[ j ] + ( sum[ i ] - sum[ j ] ) * c[ i ] + k[ i ] } 其中,sum[ i ] 表示前 i 種燈泡的總數。

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long

const int maxn=1000+5;

int n,dp[maxn],s[maxn];

struct node{
    int v,k,c,l;
    bool operator<(const node &p) const
{return v<p.v;} }a[maxn]; template<typename T>void read(T& aa) { char cc; ll ff;aa=0;cc=getchar();ff=1; while((cc<0||cc>9)&&cc!=-) cc=getchar(); if(cc==-) ff=-1,cc=getchar(); while(cc>=0&&cc<=9) aa=aa*10+cc-0,cc=getchar(); aa*=ff; }
int main(){ while(scanf("%d",&n)==1&&n){ memset(a,0,sizeof(a)); memset(dp,127,sizeof(dp)); memset(s,0,sizeof(s)); for(int i=1;i<=n;i++){ read(a[i].v);read(a[i].k);read(a[i].c);read(a[i].l); } sort(a+1,a+1+n); for(int i=1;i<=n;i++){ s[i]=s[i-1]+a[i].l; dp[i]=a[i].k+a[i].c*s[i]; for(int j=1;j<=i;j++) dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*a[i].c+a[i].k); } printf("%d\n",dp[n]); } return 0; }

【UVa11400】照明系統設計