第七讲 贪心

文章目录

    • 股票买卖 II
    • 货仓选址(贪心:排序+中位数)
    • 糖果传递(❗·贪心:中位数)
    • 雷达设备(贪心+排序)
    • 付账问题(平均值+排序❓)
    • 乘积最大(排序/双指针)
    • 后缀表达式(👍绝对值/分类讨论/贪心)

股票买卖 II

在这里插入图片描述
思路:只要对于今天来说明天的价格比今天高,我们就买,明天卖了肯定会获利。

public class Main{
	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static int N = (int) (1e5 + 10);
	static int[] a = new int[N];
	static long ans = 0;
	public static void main(String[] args) throws Exception{
		int n = sc.nextInt();
		for(int i = 1; i <= n; i++) {
			a[i] = sc.nextInt();
		}
		
		for(int i = 2; i <= n; i++) {
			if(a[i] > a[i - 1]) {
				ans += (a[i] - a[i - 1]);
			}
		}
		System.out.println(ans);
	}
}

货仓选址(贪心:排序+中位数)

在这里插入图片描述
选中位数对两边来说都比较优


public class Main{
	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static int N = (int) (1e5 + 10);
	static int[] a = new int[N];
	static long ans = 0;
	public static void main(String[] args) throws Exception{
		int n = sc.nextInt();
		for(int i = 1; i <= n; i++) {
			a[i] = sc.nextInt();
		}
		Arrays.sort(a,1, 1 + n);
		int mid = (n + 1)/2;
		for(int i = 1; i <= n; i++) {
			ans = ans + Math.abs(a[i] - a[mid]);
		}
		System.out.println(ans);
	}
}


糖果传递(❗·贪心:中位数)

本人还不是太明白

雷达设备(贪心+排序)

在这里插入图片描述
这道题也不太会,太菜了,😢
看的别人的题解,很妙题解
在这里插入图片描述
首先我们需要将小岛的坐标转换为区间,x只有在[x1,x2]才可以被搜到。
转换为以后就变成了区间覆盖问题 ,但是我们需要对区间从小到达(右端点)从小到大排序,我们只需要哦使用最近的雷达去判断是否可以,如果不可以就需要在加一个。

import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main{
	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static int N = (int) (1e4 + 10);
	static node[] a = new node[N];
	static int ans = 0;
	static int n = 0,d = 0;
	static boolean[] vis = new boolean[N];
	public static void main(String[] args) throws Exception{
		n = sc.nextInt();
		d = sc.nextInt();
		for(int i = 1; i <= n; i++) {
			int x,y;
			x = sc.nextInt();
			y = sc.nextInt();
			y = Math.abs(y);
			if(y > d) {
				System.out.println(-1);
				return;
			}
			a[i] = new node();
			a[i].l = x - Math.sqrt(d*d-y*y);
			a[i].r = x + Math.sqrt(d*d-y*y);
		}
		Arrays.sort(a,1,1 + n,new cmp());
//		for(int i = 1; i <= n; i++) {
//			System.out.println(a[i].r);
//		}
		for(int i = 1;i <= n; i++) {
			if(!vis[i]) {
				ans++;
				vis[i] = true;
				for(int j = i + 1; j <= n; j++) {
					if(a[j].l <= a[i].r) {
						vis[j] = true;
					}
				}
			}
		}
		System.out.println(ans);
	}
}
class node{
	double l,r;
}
class cmp implements Comparator<node>{
	
	public int compare(node o1, node o2) {
		if(o1.r < o2.r) {
			return -1;
		}else {
			return 1;
		}
	}
	
}

付账问题(平均值+排序❓)

在这里插入图片描述
在这里插入图片描述
思路:显然是所有人付的钱越接近平均数标准差越小,我们让所有人的数据尽可能接近标准差,首先算出平均值,然后将其进行排序,低于平均值的人把所有钱都拿出来,其余的由其他人平摊(需要注意精度问题,竟然还要用long double)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

const int N = 500010;

int n;
int a[N];

int main()
{
    long double s;
    cin >> n >> s;
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    sort(a, a + n);

    long double res = 0, avg = s / n;
    for (int i = 0; i < n; i ++ )
    {
        double cur = s / (n - i);//当前需要交多少钱
        if (a[i] < cur) cur = a[i];//如果当前的钱不够,那么就全部交
        res += (cur - avg) * (cur - avg); //把平方加到答案里面
        s -= cur;//剩下需要交的钱就减少了cur
    }

    printf("%.4Lf\n", sqrt(res / n));

    return 0;
}

乘积最大(排序/双指针)

在这里插入图片描述

在这里插入图片描述
思路:对于k是奇数且k<n的情况,我们需要特殊处理一下,转换为普遍情况,我们取一个最大的数,此时k就转换为偶数,我们可以使用双指针算法,首先对所有数进行排序,很显然负数绝对值大的在左边,偶数绝对值大的在右边,如果必须选一个正的一个负的话,显然是选的负数绝对值较小的与正数数值较小的,加个负号,显然是比较小的。

public class Main{
	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	 static int N = 100010;
	static int ans = 0;
	static int n = 0,k = 0;
	static int[]a = new int[N];
	static int mod = 1000000009;
	public static void main(String[] args) throws Exception{
		n = sc.nextInt();
		k = sc.nextInt();
		for(int i = 1; i <= n; i++) {
			a[i] = sc.nextInt();
		}
		Arrays.sort(a,1,1 +n);
		long res = 1;//初始化乘积
		int l = 1, r = n;
		int sign = 1;//标记符号位
		if(k % 2 == 1) {
			res = a[r--];//选取最大的一个数
			if(res < 0) {
				sign = -1;
			}
			k--;
		}
		while(k > 0) {
			long x = (long)a[l] * a[l+1];
			long y = (long)a[r] * a[r-1];
			if(x * sign > y * sign) {
				res = ((res % mod) * (x % mod));//不太懂为啥
				l += 2;
			}else {
                res = ((y % mod) * (res % mod));
                r -= 2;
			}
			k-=2;
		}
		System.out.println(res%mod);
	}
	
//	static int md(int x) {
//		if(x > 0) {
//			return x%mod;
//		}else {
//			
//		}
//	}

}

public class Main{
	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	 static int N = 100010;
	static int ans = 0;
	static int n = 0,k = 0;
	static int[]a = new int[N];
	static int mod = 1000000009;
	public static void main(String[] args) throws Exception{
		n = sc.nextInt();
		k = sc.nextInt();
		for(int i = 1; i <= n; i++) {
			a[i] = sc.nextInt();
		}
		Arrays.sort(a,1,1 +n);
		long res = 1;//初始化乘积
		int l = 1, r = n;
		int sign = 1;//标记符号位
		if(k % 2 == 1) {
			res = a[r--];//选取最大的一个数
			if(res < 0) {
				sign = -1;
			}
			k--;
		}
		while(k > 0) {
			long x = (long)a[l] * a[l+1];
			long y = (long)a[r] * a[r-1];
			if(x * sign > y * sign) {
				res = (md(x) * md(res));//不太懂为啥
				l += 2;
			}else {
                res = (md(y) * md(res));
                r -= 2;
			}
			k-=2;
		}
		System.out.println(md(res));
	}
	
	static long md(long x) {
		if(x > 0) {
			return x % mod;
		}else {
			return 0-((0-x)%(long)1000000009);
		}
	}

}

是否判断正负都是可以的,不太懂

后缀表达式(👍绝对值/分类讨论/贪心)

在这里插入图片描述

中缀表达式:运算符在两个操作数的位置
后缀表达式:运算符在两个操作数的后面
前缀表达式:运算符在两个操作数的前面
其实感觉和后缀表达式没有太大的关系,即使不懂也可以做

显然我们需要谈论:
(1)最简单的一种就是全是➕号,此时我们不需要进行什么操作,显然答案就是所有数的和。
(2)有一个➖号,此时我们可以通过不同的加减号的位置,可以是➕号也发挥减号的作用,-(+…+…)=>(-…-…),此时等价于好多➖号
(3)存在多个➖号,此时减号既可以当➕号,也可以当➖,因为-(-x) = +x,此时我们需要讨论所给数的正负,
对于全为加号的我们不在讨论,
如果存在减号,
1)如果全是正数,那么至少会有一个数会被减掉
2)如果全是负数,我们需要找一个最大的负数,其他的全变正数,比如-2,-3,-4,-5和3个减号,我们可以变为-2-(-5)-(-4)-(-3)此时显然是最大的。
3)有正有负,所有正数匹配正号,所有负数匹配负号,最终就是所有数的绝对值之和,比如1,2,(-3)转换为,2个➖号:1-(-3-2)=6,2-(-3-1)=6

import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;

public class Main{
	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static int N = 1000100;
	static long ans = 0;
	static int n = 0,m = 0;
	static int[]a = new int[N];
	public static void main(String[] args) throws Exception{
		n = sc.nextInt();
		m = sc.nextInt();
		int k = n + m + 1;
		for(int i = 1; i <= k; i++) {
			a[i] = sc.nextInt();
			ans = ans + (long)a[i];
		}
		if(m == 0) {
			System.out.println(ans);
		}else {
			Arrays.sort(a,1,1+k);
			ans = 0;
			ans = a[k] - a[1];
//			System.out.println(ans);
			for(int i = 2; i < k; i++) {
				ans = ans + (long)Math.abs(a[i]);
			}
			System.out.println(ans);
		}
	}
	

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2815.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot——基于SpringBoot整合Mybatis的入门案例+sql提示配置

开发流程图 先选择springboot项目创建&#xff0c;此处3.0以上的springboot项目最低都要java17版本 让数据库表中的属性名和实体类中的属性名保持一致就可以完成查询结果的自动封装。 2.引入myabtis相关依赖&#xff0c;配置mybatis 这里可以手动选择mybatis框架的依赖和mysq…

常见的卷积神经网络结构——分类、检测和分割

本文持续更新~~ 本文整理了近些年来常见的卷积神经网络结构&#xff0c;涵盖了计算机视觉领域的几大基本任务&#xff1a;分类任务、检测任务和分割任务。对于较复杂的网络&#xff0c;本文只会记录其中的核心模块以及重要的网络设计思想&#xff0c;并不会记录完整的网络结构。…

POM依赖报错解决方案汇总

POM依赖报错解决方案汇总 POM依赖报错解决方案汇总 状况 1 创建完一个maven项目,在pom文件在引入依赖,等下方自动导入加载完毕,去查看IDEA工具的Maven Projects工具选项中Dependencies 依然后依赖红色报错 2 在pom文件中,引用依赖后,该依赖的版本号处直接出现红色 3 IDEA工具…

蓝桥杯Web前端练习题-----水果拼盘

一、水果拼盘 介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案&#xff0c;本题可以使用 Flex 属性快速完成布局。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── css │ └── style.…

值得记忆的STL常用算法,分分钟摆脱容器调用的困境,以vector为例,其余容器写法类似

STL常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric>组成 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、交换、查找、遍历操作、复制、修改等等 <nuneric>体积很小&#xff0c;只包括…

【AWS入门】通过AWS存储网关(Storage Gate Way)实现文件共享

目录1. 创建网关2. 创建文件共享3. Windows文件共享4. LINUX文件共享1. 创建网关 配置缓存存储需要加载一会儿&#xff0c;此处需要等候 根据上述配置&#xff0c;会自动生成一个EC2实例 2. 创建文件共享 网关&#xff1a;选择上述步骤中创建的网关&#xff0c;选择即可 文…

电路设计的一些概念

锁存器的产生 论述1 (转)时序电路&#xff0c;生成触发器&#xff0c;触发器是有使能端的&#xff0c;使能端无效时数据不变&#xff0c;这是触发器的特性。 组合逻辑&#xff0c;由于数据要保持不变&#xff0c;只能通过锁存器来保存。 第一个代码&#xff0c;由于是时序逻…

基于XML的自动装配~

基于XML的自动装配之场景模拟&#xff1a; 自动装配&#xff1a;根据指定的策略&#xff0c;在IOC容器中匹配某一个bean&#xff0c;自动为指定的bean中所依赖的类类型或者接口类型赋值 之前我们学过的依赖注入&#xff0c;我们在为不同属性赋值时&#xff0c;例如类类型的属性…

可别再用BeanUtils了(性能拉胯),试试这款转换神器

老铁们是不是经常为写一些实体转换的原始代码感到头疼&#xff0c;尤其是实体字段特别多的时候。有的人会说&#xff0c;我直接使用get/set方法。没错&#xff0c;get/set方法的确可以解决&#xff0c;而且也是性能较高的处理方法&#xff0c;但是大家有没有想过&#xff0c;要…

数据结构与算法——堆的基本存储

目录 一、概念及其介绍 二、适用说明 三、结构图示 四、Java 实例代码 五.堆和栈的区别 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质&#xff1a; 堆中某个节点的值总是不大…

MySQL主从复制

主从复制概述 如何提升数据库并发能力 在实际工作中&#xff0c;我们常常将 Redis 作为缓存与 MySQL 配合来使用&#xff0c;当有请求的时候&#xff0c;首先会从缓存中进行查找&#xff0c;如果存在就直接取出。如果不存在再访问数据库&#xff0c;这样就 提升了读取的效率&…

I2C和SPI总线以及通信

通讯属性 概括 Serial/parallel 串行/并行Synchronous/asynchronous 同步/异步Point-to-point / bus 点对点 总线Half-duplex/full-duplex 半双工/全双工Master-slave/ equal partners 主从/对等single-ending / differential 单端/差分 点对点和总线 点对点通讯 只有两个通…

【简陋Web应用2】人脸检测——基于Flask和PaddleHub

文章目录&#x1f6a9; 前言&#x1f33a; 效果演示&#x1f966; 分析与设计&#x1f349; 实现&#x1f36c; 1. 部署人脸检测模型&#x1f36d; 2. 使用Flask构建app2.1 目录结构2.2 forms.py2.3 utils.py2.4 app.py2.5 index.html&#x1f95d; Bug(s)&#x1f6a9; 前言 本…

V2G模式下含分布式能源网优化运行研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;&#x1f381;&#x1f381;&#x1f381; 目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &am…

手写一个简单的RPC框架

学习RPC框架&#xff0c;由繁化简&#xff0c;了解其本质原理 文章目录项目简介什么是RPC&#xff1f;项目模块项目代码common模块client模块server模块framework模块测试项目简介 什么是RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff09;即远程过程调用&am…

Cursor:GPT-4 驱动的强大代码编辑器

Cursor &#xff08;https://www.cursor.so/&#xff09;是 GPT-4 驱动的一款强大代码编辑器&#xff0c;可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜&#xff0c;如下…

SWA Object Detection随机权重平均【论文+代码】

随机权重平均摘要IntroductionSWA实验部分消融实验摘要 您想在不增加推断成本和不改变检测器的情况下提高对象检测器的1.0 AP吗&#xff1f;让我们告诉您一个这样的秘方。这个秘方令人惊讶地简单&#xff1a;使用循环学习率训练您的检测器额外的12个epoches&#xff0c;然后将…

最强的Python可视化神器,你有用过么?

数据分析离不开数据可视化&#xff0c;我们最常用的就是Pandas&#xff0c;Matplotlib&#xff0c;Pyecharts当然还有Tableau&#xff0c;看到一篇文章介绍Plotly制图后我也跃跃欲试&#xff0c;查看了相关资料开始尝试用它制图。 1、Plotly Plotly是一款用来做数据分析和可视…

【数据结构】Java实现队列与循环队列

目录 1. 概念 2. 队列的使用 3. 自己动手实现队列 3.1 MyQueue接口 3.2 LinkedQueue类 3.3 入队列 3.4 出队列 3.5 获取队头元素 3.6 获取队列中有效元素个数与检测队列是否为空 3.7 toString方法 4. 整体实现 4.1 LinkedQueue类 4.2 Test类 4.3 测试结果 5. 循…

while实现1到100相加求和-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-7】while实现1到100相加求和 一、案例描述 考核知识点 while循环语句 练习目标 掌握while循环语句。 需求分析 1-100之间的数相加求和&#xff0c;本案例通过while循环语句来实现。 案例分析 效果如图2-10所示。1-100所有数的和 具体实现步骤如下&#xff1a; 在&l…
最新文章