acwing 3

33 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第35天,点击查看活动详情

某商店目前库存可乐数量为 kk 瓶。

可乐的进货价格如下:

  • 整箱:cc 元/箱。每箱有 nn 瓶。
  • 单瓶:dd 元/瓶。

请问,为了使得库存可乐数量不低于 n×mn×m 瓶,该商店至少需要花费多少元钱来购进可乐。

显然,当 k≥n×mk≥n×m 时,无需购进可乐。

输入格式

第一行包含两个整数 c,dc,d。

第二行包含两个整数 n,mn,m。

第三行包含整数 kk。

输出格式

一个整数,表示最少花费的金额。

数据范围

前 44 个测试点满足 1≤c,d,n,m,k≤101≤c,d,n,m,k≤10。
所有测试点满足 1≤c,d,n,m,k≤1001≤c,d,n,m,k≤100。

输入样例1:

1 10
7 2
1

输出样例1:

2

输入样例2:

2 2
2 1
2

输出样例2:

0
难度:中等
时/空限制:1s / 256MB
总通过数:15
总尝试数:26
来源:AcWing,第84场周赛
算法标签

挑战模式

分析

这题是acwing这几次周赛里面最简单的第三题了,这题我开始以为是一个dp,后来发现是一个简单的模拟,首先,如果k≥n*m,那么显然输出0,其他情况是如果单买比按箱买便宜的话,就直接单买,如果按箱买便宜,那么就先按先箱买,买到剩下所需量不能构成1箱时,比较这时所需价钱与一箱价钱哪个贵。

代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int N=100;
const int M=100010;
#define ll long long
int main(){
	int c,d,n,m,k;
	cin>>c>>d;//一箱c元,一瓶d元
	cin>>n>>m;//每箱n瓶,需要有n*m瓶
	cin>>k;//目前库存
	if(k>=n*m) puts("0");
	else{
		int temp=n*m-k;
		if(d*n<=c) cout<<temp*d<<endl;
		else{
			int mo=temp%n;
			int k=temp/n;
			if(mo==0) cout<<k*c<<endl;
			else{
				if(mo*d>=c) cout<<(k+1)*c;
				else cout<<k*c+mo*d<<endl;
			}
		}
	}
}

希望能帮助到大家qaq!