zoukankan      html  css  js  c++  java
  • POJ 1260 Pearls

    题意:给你n种珍珠,档次从低到高。

    每一种珍珠会给你计划要买的数量及单位价格。要你求出买原固定数量的珍珠。使得档次与价格最优。(每一个档次的珍珠花的钱=(计划数量+10)*单位价格)

    我们来看一个样例:

    3
    1 10
    1 11
    100 12
    首先原计划买的珍珠数量为100+1+1=102   花的钱{(1+10)*10+(1+10)*11+(100+10)*12}=1551

    我们按题意优化后:(102+10)*12=1344<1551。所以输出1344

    我们能够从题目中看到:

    1、题目档次高地珍珠一定比档次低得珍珠单位价格高

    2、我们仅仅能用档次高地替换档次低得珍珠

    所以我们能够思考,在到达第i类珍珠的时候,前面的最优为dp[i-1],那么当前未优化的钱是:dp[i-1]+(c[i]+10)*p[i];

    优化时。我们枚举i之前的情况,设前j种珍珠的最优是dp[j],所以买第i种珍珠的数量为sum[i]-sum[j].所以优化后的钱是:

    dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i])

    所以AC代码:

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int dp[105],c[105],p[105],sum[105];
    int main()
    {
        int t,n,i,j;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            sum[0]=0;
            for(i=1;i<=n;i++)
            {
                scanf("%d %d",&c[i],&p[i]);
                sum[i]=sum[i-1]+c[i];
            }
            dp[0]=0;
            for(i=1;i<=n;i++)
            {
                dp[i]=(c[i]+10)*p[i]+dp[i-1];
                for(j=0;j<i;j++)
                    dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i]);
            }
            printf("%d
    ",dp[n]);
    
        }
        return 0;
    }
    



  • 相关阅读:
    转: React系统的入门系统
    转: Android官方培训课程中文版(v0.9.5)
    释放Linux系统缓存
    Hyperledger Fabric1.0环境搭建
    JS中的call、apply、bind
    资产和负债
    JS以指定格式获取当前日期
    apache2.4配置ssl
    Apache2.4整合tomcat8
    使用JDK将tomcat变成https访问
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7244218.html
Copyright © 2011-2022 走看看