Discount

该博客主要介绍了如何计算最少代金券张数的问题。当面值较大的代金券不完全覆盖总金额时,需要根据余数进行分类讨论,确保最大化利用大面额代金券。博客提供了AC代码,分别对应20分和100分的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这里插入图片描述

思路

因为是要求最少的代金券张数,所以面值较大的代金劵(设面值较大的是n)需要尽可能的多。而K有时不能被n整除,所以要根据 k%n!=0 或 k%n==0 进行分类讨论。

if(k%n!=0) {

} else if(k%n==0);

在k%n!=0中也有两种情况( 设k%n=t ):有t%m!=0和k%m==0两种情况。也要分别进行运算。

if(k%n!=0) {
ans=k/n;
k=k%n;

	while(k%m!=0) {
		k=k+n;
		ans--;
	}
} else ans=k/n;

AC——20代码

#define LOCAL
#include
#include
using namespace std;
int k,m,n;
int ans;

int main() {
#ifdef LOCAL
freopen(“c:\discount\discount2.in”, “r”, stdin);
freopen(“c:\discount\discount2.out”, “w”, stdout);
#endif
int temp;
cin>>k>>n>>m;
if(n<m) swap(n,m);
//cout<<" n:"<<n<<" “<<“m:”<<m<<endl;
if(k%n!=0) {
ans=k/n;
k=k%n;
//cout<<”__________________"<<endl;
while(k%m!=0) {
k=k+n;
ans–;
}
} else ans=k/n;
//cout<<"+++++++++++++++++"<<endl;
cout<<ans<<endl;

#ifdef LOCAL
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
#endif

}

AC——100代码

#define LOCAL
#include
#include
using namespace std;
int k,m,n;
int ans;

int main() {
#ifdef LOCAL
freopen(“c:\discount\discount2.in”, “r”, stdin);
freopen(“c:\discount\discount2.out”, “w”, stdout);
#endif
int temp;
cin>>k>>n>>m;
if(n<m) swap(n,m);
//cout<<" n:"<<n<<" “<<“m:”<<m<<endl;
if(k%n!=0) {
ans=k/n;
k=k%n;
//cout<<”__________________"<<endl;
while(k%m!=0) {
k=k+n;
ans–;
}
ans=ans+k/m; //ans代表总代金劵的张数
} else ans=k/n;
//cout<<"+++++++++++++++++"<<endl;
cout<<ans<<endl;

#ifdef LOCAL
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
#endif

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值