zoukankan      html  css  js  c++  java
  • Uva 11400 照明系统

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


    每种灯泡要么全换   要么不换,若只换一部分则需要两个电源,划不来。

    先把照明电压从小到大排序,y表示前i种灯泡的数量总和

    dp[i] = min(dp[i],dp[j]+(pnode[i].y-pnode[j].y)*pnode[i].x + pnode[i].k);

    (前j个用最优方案,再把 j+1~i 全用i替换)  =>  最优解dp[n]

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #define MAX 110
    using namespace std;
    struct node
    {
        int v;
        int k;
        int x;
        int y;
    }pnode[1005];
    
    bool cmp(node a,node b)
    {
        return a.v < b.v;
    }
    int dp[1005];
    int main()
    {
        int n;
        while(scanf("%d",&n) && n)
        {
            memset(pnode,0,sizeof(pnode));
            for(int i = 1;i <= n;i++)
            {
                scanf("%d%d%d%d",&pnode[i].v,&pnode[i].k,&pnode[i].x,&pnode[i].y);
            }
    
            sort(pnode+1,pnode+n+1,cmp);
            for(int i = 1;i <= n;i++)
                pnode[i].y += pnode[i-1].y;
            memset(dp,0,sizeof(dp));
            for(int i = 1;i <= n;i++)
                for(int j = 0;j < i;j++)
            {
                if(j == 0)
                    dp[i] = pnode[i].x*pnode[i].y + pnode[i].k;
                else
                dp[i] = min(dp[i],dp[j]+(pnode[i].y-pnode[j].y)*pnode[i].x + pnode[i].k);
            }
    
            printf("%d
    ",dp[n]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    [转]ASP NET 缓存相关介绍及汇总
    比较经典的SQL行转列+分组集联
    平面向量的叉乘
    获得一点到三角形最近点
    检测线段是否有交集
    线段交集点计算
    UE4 移动设备 不显示影子问题
    Unity通过世界坐标系转换到界面坐标位置
    selemium 常用查找方法
    unity导入TexturePacker处理
  • 原文地址:https://www.cnblogs.com/Przz/p/5409837.html
Copyright © 2011-2022 走看看