zoukankan      html  css  js  c++  java
  • UVa11400

    题干略。

    题意分析:

      很容易理解一类灯泡要么全部换要么全不换,其实费用节省的主要原因是由于替换灯泡类型而排除了低压电压源,于是我们就可以推断出灯泡类型替换的原则:

      对于两类灯泡a1和a2,a1可以被a2替换的条件是:

        1)  v2>v1

        2)a2一定存在于最优解中(保证K2不被省去)

        3)C2*L1 - C1*L1 - K1<0

      基于以上替换原则首先将所有灯泡a1,a2,……,an 按电压非降序排列,我们可以假定状态d[i]为仅考虑前1~i个灯泡时的最优解(最小费用)。在计算d[i]时仅考虑用ai替换,ai一定存在于最优解中,满足条件(1)(2)。那么问题来了,采用何种替换方法呢?下面我们考虑[i-1]的最优解情况:

      假设前i-1个灯泡经过最优的替换后灯泡序列为b1,……,bj,bj+1,……bk(电压非降序排列);

      经分析bj和bj+1的关系一定满足:(1)Cj+1*Lj-Cj*Lj-Kj>0(否则bj可被bj+1替换,与当前为最优解的假设矛盾)。

      现在我们考虑用第i个灯泡 ai 替换的情况,假设bj可以被ai替换,那么有(2)Ci*Lj-Cj*Lj-Kj<0

      由不等式(1)(2)可知 Ci<Cj+1,即 Ci*Lj+1-Cj+1*Lj+1-Kj+1<0,  bj+1一定可以被ai替换,

      同理,bj~bk的所有灯泡都可以被ai替换,换句话说,在i-1个灯泡的最优替换序列 b1~aj~bk 中,如果存在 j(1<j<i-1),aj+1可以被ai替换,那么

    aj+1~bk的所有灯泡都可以被ai替换;a1~aj个灯泡的最小费用已经算出为d[j]。这样我们就得出了ai的替换方法:前j个灯泡用之前计算出的最优方案d[j]购买,剩下j+1~i个灯泡全用ai替换,枚举j从0到i-1,,根据前面的讨论得知不会漏解,则状态转移方程 d[j]=min{ d[j]+c[i]*(s[i]-s[j])+k[i] | j from 0 to i-1 },s[i]为前i类灯泡的总数目。

    代码如下:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 using namespace std;
     5 #define maxn 1000
     6 int n;
     7 int V[maxn+5];
     8 int K[maxn+5];
     9 int C[maxn+5];
    10 int L[maxn+5];
    11 int id[maxn+5];
    12 int s[maxn+5];
    13 int d[maxn+5];
    14 bool cmp(int a,int b){
    15     return V[a]<V[b];
    16 }
    17 int dp(int i){
    18     int ans=100000000;
    19     for(int j=0;j<i;j++)
    20         ans=min(ans,d[j]+C[id[i]]*(s[i]-s[j])+K[id[i]]);
    21     return ans;
    22 }
    23 int main(int argc, const char * argv[]) {
    24     while(scanf("%d",&n)==1&&n){
    25         for(int i=1;i<=n;i++)
    26             scanf("%d%d%d%d",&V[i],&K[i],&C[i],&L[i]);
    27         for(int i=0;i<=n;i++)
    28             id[i]=i;
    29         sort(id+1,id+1+n,cmp);
    30         s[0]=0;
    31         for(int i=1;i<=n;i++)
    32             s[i]=s[i-1]+L[id[i]];
    33         d[0]=0;
    34         for(int i=1;i<=n;i++)
    35             d[i]=dp(i);
    36         printf("%d
    ",d[n]);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    请求headers处理
    requests模块
    urllib3
    urllib
    百度AI搜索引擎
    CSS层叠样式表--使用
    学习requests_html
    聚合新闻头条
    爬虫工程师的月薪如何?
    Linux日志系统
  • 原文地址:https://www.cnblogs.com/Kiraa/p/5510757.html
Copyright © 2011-2022 走看看