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;
}

谢谢观看,喵。

posted @ 2024-03-02 22:49  ydkxj  阅读(21)  评论(1编辑  收藏  举报