题目
思路
因为是要求最少的代金券张数,所以面值较大的代金劵(设面值较大的是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
}