20201206贪心法1课后总结

2023-10-28

贪心法1题目总结

贪心法定义

通过一个简单策略,来求得问题的最优解

贪心法技巧

  1. 区间类的贪心,则可考虑左端点或右端点排序

贪心习题(选自题单

#10080. 删数问题
思路

循环 n n n次,每次遍历一遍字符串,如一字符比后面字符大,则字符全部往前移一位(达到删除作用)

注意
  1. 前导0的判断
代码
#include<bits/stdc++.h>
using namespace std;
string st;
int n,len,p;
bool flag;
int main(){
    cin>>st>>n;
    len=st.size();
    while(n--){
        flag=false;
        for(int i=0;i<len-1;i++){
            if(st[i]>st[i+1]){
                for(int j=i;j<len;j++)
                	st[j]=st[j+1];
                len--;
                flag=true;
                break;
            }
        }
        if(!flag)len--;
    }
    while(p<len-1&&st[p]=='0')p++;
    for(int i=p;i<len;i++)cout<<st[i];
	return 0;
}
#10081. 活动选择
思路

首先,看到区间贪心,就想到排序!排完序,根据右端点,判断是否在一个区间的左端点内,如在则不选,反之就选

代码
#include<bits/stdc++.h>
using namespace std;
struct game{
    int begin;
    int end;
}a[1010];
int n,k,c;
bool cmp(game a,game b){
	return a.end<b.end;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i].begin>>a[i].end;
    }
    sort(a,a+n,cmp);
    int end=a[0].end;
    c=1;
    for(int i=1;i<n;i++){
        if(a[i].begin>=end){
            c++;
            end=a[i].end;
        }
    }
    cout<<c;
    return 0;
}
#10038. 最大整数
思路

这道题方法很简单,就是排序,可是怎么排序?这里有一个误区,会误以为直接将字符串按字典序从大到小排序就能AC,但是会有特例(如下图)。所以应根据连接起来后的字符串的字典序排序。

代码
/*
ID: zhangbe5
TASK: test
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
string s[30];
bool cmp(string a,string b){
	if(a+b>b+a)return true;
	else return false;
} 
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		cin>>s[i];
	}
	sort(s+1,s+n+1,cmp);
	for(int i=1;i<=n;i++){
		cout<<s[i];
	}
	return 0;
}
#10082. 整数区间
思路

恒古不变:看到区间想排序!右端点从小到大排序,判断是否在一个区间的范围内,是则答案数+1,反之继续找。

另外,选在区间的端点上比选在区间内的一个点上的方案要更优,因为选在端点上方便判断是否重叠。

代码
/*
ID: zhangbe5
TASK: test
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,ans,tmp;
struct node{
	int x,y;
}a[10010];
bool cmp(node a,node b){
	return a.y<b.y;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i].x,&a[i].y);
	}
	sort(a+1,a+n+1,cmp);
	tmp=INT_MIN;
	for(int i=1;i<=n;i++){
		if(a[i].x<=tmp){
			continue;
		}else{
			ans++;
			tmp=a[i].y;
		}
	}
	printf("%d",ans);
	return 0;
}
#10045. 零件分组
思路

恒古不变:看到区间想排序。按照长度从小到大排序,因为本题要求两个变量同时不下降排列,则先让其中一个变量不下降排列,则只要看另一个变量划分组别即可。

代码
/*
ID: zhangbe5
TASK: test
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
struct node{
	int l,w;
}a[1010];
int ans;
bool f[1010];
bool cmp(node a,node b){
	return a.l<b.l||a.l==b.l&&a.w<b.w;
} 
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i].l,&a[i].w);
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(!f[i]){
			int cur=a[i].w;
			for(int j=i+1;j<=n;j++){
				if(!f[j]){
					if(cur<=a[j].w){
						cur=a[j].w;
						f[j]=true;
					}
				}
			}
			f[i]=true;
			ans++;
		}
	}
	printf("%d",ans);
	return 0;
}
#10040. 纪念品组合
思路

将所有纪念品价格从小到大排序,一头一尾地选择符合要求的两个数(尽可能分更多的组),最后输出组数

注意

在算组数时,不要忘记算进单独一个数的情况

代码
/*
ID: zhangbe5
TASK: test
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int w,n,a[30010],ans,l,r;
bool f[30010];
int main(){
	scanf("%d%d",&w,&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	} 
	sort(a+1,a+n+1);
//	for(int i=1;i<=n;i++){
//		if(!f[i]){
//			for(int j=n;j>=i+1;j--){
//				if(a[j]+a[i]<=w&&!f[j]){
//					f[i]=f[j]=true;
//					break;
//				}
//			}
//			ans++;
//		}
//	}
	l=1;
	r=n;
	while(l<r){
		if(a[l]+a[r]<=w){
			ans++;
			l++;
			r--;
		}else{
			r--;
			ans++;
		}
	}
	if(l==r)ans++;
	printf("%d",ans);
	return 0;
}
#10021. 均分纸牌
思路

计算出所有数的平均值,后根据平均值多到少分配(可以先“赊”一下,之后再还)

代码
/*
ID: zhangbe5
TASK: test
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,a[110],ave,ans;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		ave+=a[i];
	}
	ave/=n;
	for(int i=1;i<=n;i++){
		if(a[i]==ave){
			continue;
		}
		ans++;
		if(a[i]>ave){
			a[i+1]+=a[i]-ave; 
		}else{
			a[i+1]-=(ave-a[i]);
		}
		a[i]=ave;
	}
	printf("%d",ans);
	return 0;
}
#10043. 美元汇率
思路

每过去一天,计算一次若换算则能得到多少钱,不断找最多的,最后输出

代码
/*
ID: zhangbe5
TASK: test
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double d=100,m;
int n;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		double x;
		cin>>x;
		x/=100;
		double dd=d;
		d=max(d,m/x);
		m=max(m,dd*x);
	}
	printf("%.2lf",d); 
//	cout<<fixed<<setprecision(2)<<d;
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

20201206贪心法1课后总结 的相关文章

随机推荐

  • JavaScript中字符串的大小写转换(轮子,直接cv即可)

    此文件为js文件 封装模块按需导出即可 str 需要首字母转换的字符串 全部大写 export const all2Large str gt const arr str split let newStr 通过数组的forEach方法来遍历数
  • 解决Ubuntu下 anaconda 与ros opencv冲突的问题

    解决Ubuntu下 anaconda 与ros opencv冲突的问题 问题描述 解决办法之一 问题描述 在Ubuntu16 04上先后安装了Anaconda和ROS 然后在anaconda配置的pytorch环境中运行python代码 在
  • 【毕设】基于CycleGAN的风格迁移【一】环境搭建及运行代码

    源代码地址 CycleGAN源码 因为该篇内容包含Anaconda的环境管理及包的管理 可以选择参考 Anaconda安装 环境管理 包管理 实际演练例子 全网最详细 MrRoose1的博客 CSDN博客 一 搭配环境 1 首先把代码包下载
  • 递归、回溯-图的m着色问题

    1 问题描述 给定无向连通图G V E 和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法使G中每条边的2个顶点着不同颜色 这个问题是图的m可着色判定问题 输入 图的顶点的个数 颜色种类树m 输出顶点a与顶
  • C

    我们想定义一个全局变量 能够在多个文件中使用 举例说明比如说三个文件main c hello c hello h 想在main c和hello c中使用一个名字为a的变量 可能大家会简单地想直接在hello h里面定义一个变量unsigne
  • 网站渗透测试 越来越难渗透

    福利 网络安全重磅福利 入门 进阶全套282G学习资源包免费分享 最先 对于大家提出的难题 网站愈来愈难渗透 表明如今的安全防护技术性及其网站结构技术性的成熟情况是越来越健全了 次之 某一实际技术性方面的安全要求减少了 不可以整体表明渗透测
  • 分页组件的使用-jqPaginator

    工作中用到了分页 在github上面用到了一款分页组件 是叫jqPaginator 参考网站是 http jqpaginator keenwon com a3 上面可以下载 以及介绍怎么使用 贴出我使用的例子的代码 html div cla
  • 2020最新大厂高频微服务面试总结:Spring-Cloud+Spring-Boot+Dubbo(面试题+笔记+项目实战)

    话不多说 直接上题 SpringCloud面试题 什么是 Spring Cloud 使用 Spring Cloud 有什么优势 服务注册和发现是什么意思 Spring Cloud 如何实现 Spring Cloud 和dubbo区别 Spr
  • Linux MySQL 常见无法启动或启动异常的解决方案

    Linux MySQL 常见无法启动或启动异常的解决方案 在 Linux 上自建 MySQL 服务器 经常遇到各种无法启动或启动后异常的问题 本文列举一些常见问题的解决办法 注意 以下错误日志提示 都是查看 MySQL 错误日志得到 查看方
  • 深度理解volatile关键字

    Volatile java中可以把字段声明为volatile的 比如 public class AtomicInteger extends Number implements java io Serializable volatile变量
  • 华为OD机试 Python 【整数数组中同时出现的整数】

    描述 你有两组整数 你的任务是找出哪些整数在这两组中都出现了 如果找到了这样的整数 还需要注意它们分别在两组里出现了几次 取其中较小的那个次数为其 共同出现次数 要求如下 先按 共同出现次数 分类整数 再按这个次数从小到大输出 如果某个 共
  • 国产开源中文大语言模型再添重磅玩家:清华大学NLP实验室发布100亿参数规模的开源可商用大语言模型CPM-Bee

    5月27日 OpenBMB发布了一个最高有100亿参数规模的开源大语言模型CPM BEE OpenBMB是清华大学NLP实验室联合智源研究院成立的一个开源组织 该模型针对高质量中文数据集做了训练优化 支持中英文 根据官方的测试结果 其英文测
  • C++:计算Fibonacci数列的前30项并动态分配、用指针实现两数交换、买鸡问题、求圆的方法。

    任务一 编写一个C 风格的程序 用动态分配空间的方法计算Fibonacci数列的前30项 并将结果存储到动态分配的空间中 任务二 编写一个C 风格的程序 自定义一个函数 要求实现输入两个整数 让他们交换两个数的位置后输出 要求写一个自定义函
  • 关于Apple支付productID类型验证分析

    Apple中的productID类型包括 消耗型项目 非消耗型项目 自动续期订阅 非自动续期订阅项目 消耗型项目的验证 1 客户端发起Apple支付玩家完成付款 2 客户端收到Apple返回的票据信息 并对票据信息进行遍历发送到服务端做验证
  • 根据GUID获得设备路径(转载)

    根据GUID获得设备路径 include
  • python开发web后端如何处理高并发的思路

    1 什么是高并发 高并发 High Concurrency 是互联网分布式系统架构设计中必须考虑的因素之一 它通常是指 通过设计保证系统能够同时并行处理很多请求 高并发相关常用的一些指标有响应时间 Response Time 吞吐量 Thr
  • 【E题】2023年电赛运动目标控制与自动追踪系统方案

    系统的设计和制作可以按照以下步骤进行 设计红色光斑位置控制系统 选择合适的红色激光笔 并将其固定在一个二维电控云台上 使用电机和编码器来控制电控云台的水平和垂直运动 设计一个控制电路 可以通过输入控制信号来控制电机的运动 从而控制红色光斑的
  • 深度学习笔记(九)AutoEncoder自动编码器

    前面的神经网络都是是基于监督的网络 这一章节主要是介绍非监督学习网络 原理很简单 自己学习 然后将学习的内容反过来生存初始状态 然后对比 自动编码器是一种尽可能复现输入信号的神经网络 自动编码器必须获取到代码输入数据的最主要的因素 类似于P
  • &与&&有什么区别?

    一 简要说明 按位与 a b是把a和b都转换成二进制数然后再进行与的运算 逻辑与 a b就是当且仅当两个操作数均为 true时 其结果才为 true 只要有一个为零 a b就为零 例如 a b 9 8 1001 1000 结果是1000 a
  • 20201206贪心法1课后总结

    文章目录 贪心法1题目总结 贪心法定义 贪心法技巧 贪心习题 选自题单 http wikioi cn training mission 10 10080 删数问题 http wikioi cn problem 10080 思路 注意 代码