购买矿石
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.
你的任务是帮助公司找出最小花费的购买计划。
输入
第一行是正整数
n
(
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;
}