问题 G: 找零钱 等贪心算法例子汇总

问题 G: 找零钱
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB

解决: 557提交: 796统计
题目描述
小智去超市买东西,买了不超过一百块的东西。收银员想尽量用少的纸币来找钱。
纸币面额分为50 20 10 5 1 五种。请在知道要找多少钱n给小明的情况下,输出纸币数量最少的方案。 1<=n<=99;
输入
有多组数据 1<=n<=99;
输出
对于每种数量不为0的纸币,输出他们的面值数量,再加起来输出
样例输入 Copy
25
32
样例输出 Copy
20
1+51
20
1+101+12
简单的贪心算法,没什么好讲的。

#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
int main() {
	int N;
	int b[5] = {50,20,10,5,1};
	int a[5];
	while(~scanf("%d",&N)) {
		int k = 0;
		memset(a,0,sizeof(a));
		while(N>=50) {
			a[0]++;
			N-=50;
			k = 1;
		}
		while(N>=20) {
			a[1]++;
			N-=20;
			k = 2;
		}
		while(N>=10) {
			a[2]++;
			N-=10;
			k=3;
		}
		while(N>=5) {
			a[3]++;
			N-=5;
			k = 4;
		}
		while(N>=1) {
			a[4]++;
			N-=1;
			k = 5;
		}
		//不管哪种币都会遍历,所以k保存的是最后面的一个币值,,,
		//遍历都最后一个币值,那就判断; 
		for(int i = 0; i < 5; i++) {
			if(a[i]!=0) {

				printf("%d*%d",b[i],a[i]);
				if(i+1!=k) printf("+");
			}
		}
		printf("\n");
	}
	return 0;
}

问题 A: 看电视
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 32 MB

解决: 1049提交: 2262统计
题目描述
暑假到了,小明终于可以开心的看电视了。但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目。
现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗?
输入
输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。
接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。
当n=0时,输入结束。
输出
对于每组输入,输出能完整看到的电视节目的个数。
样例输入 Copy
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
样例输出 Copy
5
这道题是区间贪心的思想
在这里插入图片描述
其实可以发现,对于x排序即可,x相同,y怎么排都无所谓对这道题来说
但是如果要求 包含所有区间的点的最小值
在这里插入图片描述
那么此时就必须注意对y的排序必须从小排,因为所以,你好好想一想把,就是区间小的肯定会包含区间大的,,,,而区间大的你设立一个点,这个点不一定会覆盖到,,,但是发现其实也不用关心,,,因为它的判断条件是y小于lastX 那么此时可以假定,这个点就应该是在区间小的部分,那么y怎么排也还是无所谓。

#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
struct t {
	int x,y;
} T[200];
bool cmp(t a, t b) {
	if(a.x!=a.y) return a.x > b.x;
	else return a.y<b.y;
}
int main() {
	int N;
	while(~scanf("%d",&N)&&N!=0) {
		for(int i = 0; i < N; i++) {
			int a,b;
			scanf("%d%d",&a,&b);
			T[i].x = a;
			T[i].y = b;
		}
		sort(T,T+N,cmp);
		int ans = 1;
		int lastX = T[0].x;
		for(int i =1; i < N; i++) {
			if(T[i].y<=lastX) {
				ans++;
				lastX = T[i].x;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}


矩形镶嵌问题,ceil函数的使用,记得里面的数必须用double,

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	
	int n,m;
	double a,b,c;
	scanf("%d%d",&n,&m);
	scanf("%lf",&a);
	b = ceil(n / a);
	c = ceil(m / a);
	printf("%.f",b*c);
	
}






发布了154 篇原创文章 · 获赞 4 · 访问量 8620

猜你喜欢

转载自blog.csdn.net/weixin_38023259/article/details/105250313
今日推荐