1271: 买铅笔

1271: 买铅笔

时间限制: 1 Sec  内存限制: 512 MB
提交: 42  解决: 24
提交 状态 讨论版

命题人:admin

题目描述

P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 33种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。

 

商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。

 

现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。


 

 

 

输入

第一行包含一个正整数n,表示需要的铅笔数量。

 

接下来三行,每行用2个正整数描述一种包装的铅笔:其中第1个整数表示这种 包装内铅笔的数量,第2个整数表示这种包装的价格。

 

保证所有的7个数都是不超过10000的正整数。

 

输出

1个整数,表示P老师最少需要花费的钱。

 

样例输入

57
2 2
50 30
30 27

 

样例输出

54

 

提示

铅笔的三种包装分别是:

 

  • 22支装,价格为2;
  • 5050支装,价格为30;
  • 3030支装,价格为27。

P老师需要购买至少57支铅笔。

 

如果她选择购买第一种包装,那么她需要购买29份,共计2 * 29=58支,需要花费的钱为2 * 29 = 58。

 

实际上,P老师会选择购买第三种包装,这样需要买2份。虽然最后买到的铅笔数 量更多了,为30 * 2 = 60支,但花费却减少为27 * 2 = 54,比第一种少。

 

对于第二种包装,虽然每支铅笔的价格是最低的,但要够发必须买2份,实际的花费达到了 30 * 2 = 60,因此P老师也不会选择。

 

所以最后输出的答案是54。

 

整个题的思路很简单,题目中给出的三种方案,计算所有方案花费的最小值,而每种方案又分为两种情况:第一种就是老师需要的铅笔数除以每种方案的包装内铅笔的个数是否有余数,如果有的话就需要在最后他俩相除的结果上再加上1,代表老师至少需要买这么多个包装的铅笔,如果可以除尽的话就不必加1,刚刚好,然后乘以每个包装的单价就是每种方案需要花费的金钱数,最后在输出三种方案中花费最小的那种情况即可

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int min(int x, int y) {
	if (x <= y)
		return x;
	else
		return y;
}
int main()
{
	int n;
	cin >> n;

	int x1, y1; //x1和y1分别代表包装内铅笔的个数和这个包装的价格
	int x2, y2;//同上
	int x3, y3;

	cin >> x1 >> y1;
	cin >> x2 >> y2;
	cin >> x3 >> y3;
	int sum1, sum2, sum3;//分别代表每种方案的花费钱数

	if (n%x1 != 0) {//首先判断铅笔总数n对包装内笔的个数能否除尽
		int k = n / x1 + 1;//不能除尽的话要在除数的结果上再加上一个1
		sum1 = k * y1;//最后用单价y1乘以需要的包装个数就是花费的金钱数
	}
	else {
		int k = n / x1;//如果正好可以除尽的话,最后就不用加1
		sum1 = k * y1;
	}
	if (n%x2 != 0) {//第二种方案同上
		int k = n / x2 + 1;
		sum2 = k * y2;
	}
	else {
		int k = n / x2;
		sum2 = k * y2;
	}
	if (n%x3 != 0) {//第三种方案同上
		int k = n / x3 + 1;
		sum3 = k * y3;
	}
	else {
		int k = n / x3;
		sum3 = k * y3;
	}

	cout << min(sum1, min(sum2, sum3)) << endl;//最后输出三种方案中花费的最小数


	return 0;
}

 

没有更多推荐了,返回首页