IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 贪心算法学习记录 -> 正文阅读

[数据结构与算法]贪心算法学习记录

qsort()中cmp函数用法:
https://blog.csdn.net/m0_51627418/article/details/121246105?spm=1001.2014.3001.5502

一、活动安排问题

在这里插入图片描述
输入样例

11
1 4
3 6
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14  

输出样例

4  

分析:
对每一个活动按照占用会场时间排序,其实也是按照结束时间来排序的。因为安排一个活动后,在这个活动结束时间之前,是不能在安排活动的。就可以分为结束时间相等和不等两种情况来判断。这里的cmp:如果结束时间一样,就找是开始时间小的(这样占用时间最短);如果结束时间不一样就是就找最早结束的。
这里的代码实现原理:

cmp()会有三种返回值(以qsort为例):
1、返回一个正数:a排列在b之后;
2、返回0:a、b相等;
3、返回一个负数:a排在b之前;

过题C语言代码:

// #include<bits/stdc++.h>
// using namespace std;
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* a,const void* b){
    if(((int *)a)[1]==((int *)b)[1]) return  ((int *)a)[0]-((int *)b)[0];
    else return ((int *)a)[1]-((int *)b)[1];
}
int main(){
    int n;
    scanf("%d",&n);
    int a[n+5][2];
    for(int i = 0; i <n;i++)   scanf("%d%d",&a[i][0],&a[i][1]);
    qsort(a,n,2*sizeof(int),cmp);
    int count = 1, j = 0;
    for(int i = 1; i <n;i++){
            if(a[i][0]>=a[j][1]){
                j = i;
                count ++;
            }        
    }
    printf("%d",count);
    return 0;
} 

二、最优装载问题

在这里插入图片描述
输入样例

8 30
4 10 7 11 3 5 14 2  

输出样例

5

就是一个选最小没啥可说的
解题代码:

//#include<bits/stdc++.h>
//using namespace std;
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* a,const void* b){
	return *((int*)a) - *((int*)b);
}
int main(){
	int n,m,cnt = 0;
	scanf("%d%d",&n,&m);
	int a[n+10];
	for(int i = 0; i < n;i++){
		scanf("%d",&a[i]);
	}
	qsort(a,n,sizeof(int),cmp);
	int sum= 0;
	for(int i = 0; i < n; i++){
		sum += a[i];
		if(sum>m) break; 
		cnt++;
	}
	printf("%d",cnt);
	return 0;
}
 

三、背包问题(贪心版本 可拆分版本)

在这里插入图片描述
输入样例

3 15
5 10
2 8
3 9  

输出样例

60  

分析
其实这因该是一个思维题吧。可以拆分,就直接每个物品都拆为单位重量价值。然后查找最大的单位重量价值,乘以背包容量,就是背包所能装的最大价值。

过题代码:

#include<stdio.h>
#include<algorithm>
#include<math.h>
//#include<bits/stdc++.h>
//using namespace std;
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
  	double x,y;
  	double a[n+10];
    for(int i = 0; i <n;i++){
    	scanf("%d%d",&x,&y);
    	a[i] = y/x;
	} 
	int t = 0;
    for(int j = 1,i=0;j<n;j++){
    	if(a[j]>a[i])  t = a[i],a[i]= a[j],a[j]= t;
	}
	int ans = m*a[0];
   	printf("%d",ans);
    return 0;
}

五、删数问题

在这里插入图片描述
输入样例

178543 4  

输出样例

13  

思路:

过题代码:

#include<stdio.h>
#include<algorithm>
#include<math.h>
//#include<bits/stdc++.h>
//using namespace std;
int main(){
	char ch[240];	
	int a[250],cnt = 0;
	scanf("%s",ch); 
    for(int i = 0; ch[i]!='\0';i++){
    	cnt ++;
		a[i] = ch[i] -'0';
	}
	
	int ccnt =0,s = 0; 
	printf("%d",a[0]);
	
	for(int i = 1; i <cnt;i++){
		if(ccnt<4&&a[s]<a[i]) ccnt++;
		else{
			printf("%d",a[i]);
			s = i;
		} 
	}
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:57:52  更:2022-05-01 16:00:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:40:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码