zoukankan      html  css  js  c++  java
  • Lighting System Design UVA

    题意:你的任务是设计一个照明系统。一共有n(n<=1000)种灯泡选择,不同种类的灯泡必须有不同的电源,但同一种灯泡可以用同一种电源。

    每种灯泡用四个数值表示:电压值V,电源费用K,每个灯泡的费用C,和所需灯泡的数量L。

    题解:首先可以想到一个结论;每种电压的灯泡要么全换,要么全不换。因为如果只换部分灯泡,则两种电源都需要,不划算。(为什么我没想到)

    先把灯泡按照电压从小到大排序,设sum[ i ] 为前 i 种灯泡的总数量,dp[ i ] 表示为灯泡1~i 的最小开销,那么:

      dp[ i ]=min { dp[ j ] + ( sum[ i ] - sum [ j ] )*c[ i ] + k[ i ] }

    作者真TM牛逼,以上解释摘自紫书。还是要多学学套路啊!!!!

     1 #define INF 1e8
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 
     8 const int maxn=1005;
     9 
    10 struct node{
    11     int V,K,C,L;
    12     bool operator<(const node& i)const{
    13         return V<i.V;
    14     }
    15 }a[maxn];
    16 
    17 int n;
    18 int dp[maxn],sum[maxn];
    19 
    20 void solve(){
    21     fill(dp+1,dp+n+1,INF);
    22     dp[0]=0;
    23     for(int i=1;i<=n;i++)
    24         for(int j=0;j<i;j++)
    25             dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j])*a[i].C+a[i].K);
    26     cout<<dp[n]<<endl;
    27 }
    28 
    29 int main()
    30 {   while(cin>>n&&n){
    31         for(int i=1;i<=n;i++) scanf("%d%d%d%d",&a[i].V,&a[i].K,&a[i].C,&a[i].L);
    32         sort(a+1,a+n+1);
    33         sum[0]=0,a[0].C=0,a[0].K=0,a[0].L=0,a[0].V=0;    
    34         for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].L;
    35         
    36         solve();
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    2020CCPC秦皇岛 K 【Kindom's Power】(树上贪心dp)
    对于树上状态机dp问题的一些总结与思考
    PTA_L3题解集
    PTA_L2题解集
    树上dp_学习笔记
    2020牛客国庆集训派对day2 B【Cheap Delivers】(最短路+状压dp)
    2020牛客国庆集训派对day1
    Codeforces 1426F【Number of Subsequences】(dp)
    2019icpc陕西省赛
    CF1281E【Jeremy Bearimy】(树上点对最大值/最小值和)
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/7299753.html
Copyright © 2011-2022 走看看