设计照明系统

试题描述

设计一个照明系统。共有n种灯泡供你选择,不同种类的灯泡必须使用不同种类的电源,但同一种灯泡可以共用一个电源。所有灯泡的电流参数相同,电压不同。现在给你每种灯泡的四个参数:电压V,电源费用K,每个灯泡的价格C,以及需要该种灯泡的数量L。为了减少费用,你可以把电压低的灯泡换成电压更高的灯泡,而省出电源的费用(某种灯泡全换成别的种类,就可以共用别的电源,从而少配一个电源,不就节约了一个电源的费用吗?)。请你配置方案,使系统造价最小。新的方案标准不能降低,灯泡的数量不能减少,电流相同、电压高的灯泡功率也更大,也会更亮。

输入
第一行包括一个正整数n,接下来的n行,每行描述一种灯泡的参数,分别为V,K,C和L。两数之间用一个空格分隔。
输出
一个数表示电源的最小费用。
输入示例
3 12 300 10 30 18 400 15 28 30 500 13 30
输出示例
1644
其他说明
数据范围:0 < n <= 1000,0 < V <= 132000,0 < K <= 1000,0 < C <= 20,0 < L <= 100

 

#include <iostream>
using namespace std;
int n;
int s[10010],dp[10010];
struct node//定义结构体详情请见1、 
{
       int v,k,c,l;
       bool operator < (const node & a)const//详情请见重载运算符2、 
       {
            return v<a.v;
       }
}
a[1005];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)//输入结构体 
        cin>>a[i].v>>a[i].k>>a[i].c>>a[i].l;
    sort(a+1,a+n+1);//这一定要在有运算符重载下才能排序结构体 
    for(int i=1;i<=n;i++)//这就是经典的前缀和 
        s[i]=s[i-1]+a[i].l;
    memset(dp,27,sizeof(dp));
    dp[0]=0;
    for(int i=1;i<=n;i++)
        for(int j=0;j<i;j++)
            dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*a[i].c+a[i].k);//核心代码 
    cout<<dp[n];
}
/*
1、结构体:一个新的数据类型,名字由自己定义,地位与用法和int相同 
语法规则:
         struct(类型名) 
         {
             变量列表(可以附加函数)
         }
         例如:
         struct student
         {
               int chinese;
               int math;
               int english;
         }
         student stu[10010];
         使用时:stu[1].chinese(第一个学生的语文成绩)
2、memset(dp,27,sizeof(dp))(给dp数组每一个变量赋予最大值) 
3、重载运算符:这当模板背就行了。 
       bool operator < (const node & a)const
       {
            return v<a.v;
       }
       node是struct数组的名称,a是变量. 
*/
 
                
View Code

 

posted @ 2017-03-18 15:34  Dijkstra·Liu  阅读(169)  评论(0编辑  收藏  举报