• 【UVa11400】照明系统设计


    题目描述

    设计某个地方的照明系统 ,一共需要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
    ",dp[n]);
        }
        return 0;
    }
  • 相关阅读:
    Java搭建邮件服务器并发送Excel附件
    Java发送Http带HEADER参数
    MySql 技术内幕 (查询处理和子查询)
    《MySQL技术内幕:SQL编程》笔记
    MySql 技术内幕 (数据类型)
    替换Jar包里文件
    [Python数据分析]新股破板买入,赚钱几率如何?
    一些资料
    sqlval
    IBM CLI 和 ODBC
  • 原文地址:https://www.cnblogs.com/rlddd/p/9495272.html
Copyright © 2020-2023  润新知