CF1934题解
题解
对了,推销下我的博客,有什么需要改正的望大佬们告知,请多多海涵,谢谢。
首先拜谢波叔呀,一眼看上去没思路,直到看见了四重循环,大彻大悟。
Solution
没什么好说的,暴力四重
题意大意就是给你一个数,在 1,3,6,10,15 中取数,使取出的数等于输入的数,求出至少需要用多少个数。
求数代码:
for(long long i=0;i<=2;i++){
for(long long j=0;j<=1;j++){
for(long long k=0;k<=4;k++){
for(long long f=0;f<=2;f++){
if (i+j*3+k*6+f*10<=n&&(n-i-j*3-k*6-f*10)%15==0){
ans=min(ans,i+j+k+f+(n-i-j*3-k*6-f*10)/15);
}
}
}
}
}
这一段总体上采用暴力枚举的方法,利用贪心进行优化。由题意得,我们可知:
-
如果能用面值更大且数量更少的,就进行替换。
-
最后至多只会存在两个一元。
感觉挺抽象的是吧,举个例子罢:
如凑出 5 元,则可以选择 1 个三元纸币,再使用 2 个一元纸币。
因为要求最小,所以 ans 要初始化为无穷大。
CODE
#include<iostream>
using namespace std;
long long t,ans;
void solve(long long n){
for(long long i=0;i<=2;i++){
for(long long j=0;j<=1;j++){
for(long long k=0;k<=4;k++){
for(long long f=0;f<=2;f++){
if (i+j*3+k*6+f*10<=n&&(n-i-j*3-k*6-f*10)%15==0){
ans=min(ans,i+j+k+f+(n-i-j*3-k*6-f*10)/15);
}
}
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>t;
while(t--)
{
long long n;
cin>>n;
ans=2147483647;
solve(n);
cout<<ans;
}
return 0;
}
谢谢观看,喵。