2014寒假ACM集训13级PK赛-购买矿石

购买矿石

Time Limit: 1000MS Memory limit: 65536K

题目描述

作为一家矿石采购商,每月都要从国际市场上采购一批矿石,由于资源日益紧缺,矿石的价格几乎每月都上涨,由于国内市场因素,矿石不能一次采购太多,否则卖不出去,公司就会亏损。

今天公司制定了一个采购计划,计划在未来的4个月内采购 A, B, C, D 4个品种的矿石各一批,因为资金的因素,每个月只能采购一个品种的矿石期中A的价格为PA=200, 价格变化因子为RA=1.01, 这意味着i月后购买的价格为P=PA*(RA)i ,其他矿石的价格和价格变化因子分别为B:PB=300, RB=1.12, C:PC=400,RC=1.05, D:PD=650, RD=1.10

不同的购物方法最后的花费是不一样的,最佳的购买计划是:第一个月购买D矿石,第2个月购买B矿石,第3个月购买C矿石,最后购买A矿石。最终的花费为1633.06.

你的任务是帮助公司找出最小花费的购买计划。

输入

  第一行是正整数 1 n 100 )表示计划购买的矿石数量,接下来 n 行每行两个数字,分别表示矿石的价格和价格变化因子。

输出

  你算出的最小的花费值,精确到小数点后 2 位。

示例输入

4
200.0 1.01
300 1.12
400 1.05
650 1.1

示例输出

1633.06

提示

 

来源

 中国海洋大学第四届朗讯杯初级组

 

 

小贪心

 

#include <stdio.h>
#include <string.h>
#include <math.h>

struct m
{
    double mon;
    double ad;
} a[110];

int main()
{
    int n,i,k;
    scanf ("%d",&n);
    for (i = 0; i < n; i++)
    {
        scanf ("%lf%lf",&a[i].mon,&a[i].ad);
    }
    double money = 0;
    for (i = 0;i < n;i++)
    {
        int imax = 0;
        for (k = 1;k < n;k++)
        {
            if ((a[imax].ad - 1) * a[imax].mon < (a[k].ad - 1) * a[k].mon)
                imax = k;
            else if ((a[imax].ad - 1) * a[imax].mon == (a[k].ad - 1) * a[k].mon)
                if (a[imax].ad < a[k].ad)
                    imax = k;
        }
        money += a[imax].mon;
        a[imax].mon = 0;
        for (k = 0;k < n;k++)
        {
            a[k].mon *= a[k].ad;
        }
    }
    printf ("%.2lf\n",money);
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值