秒懂百科,C++如此简单丨第二十天:贪心算法2

目录

Everyday English

前言

洛谷 P1031 均分纸牌

题目描述

思路点拨

AC代码

洛谷 P1094 纪念品分组

题目描述

样例输入

样例输出 

思路点拨

AC代码

洛谷 P2660 zzc 种田 

题目描述

思路点拨

AC Code

结尾


Everyday English

Don't miss the opportunity.

机不可失,时不再来。

前言

这节课是贪心算法的习题课,我们会讲解三道题目。

洛谷 P1031 均分纸牌

题目网址:[NOIP2002 提高组] 均分纸牌 - 洛谷

题目描述

有 N 堆纸牌,编号分别为 1,2,……,N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。

移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N−1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

例如 N=4 时,4堆纸牌数分别为 9,8,17,6。

移动 3 次可达到目的:

  • 从第三堆取 4 张牌放到第四堆,此时每堆纸牌数分别为 9,8,13,10。
  • 从第三堆取 3 张牌放到第二堆,此时每堆纸牌数分别为 9,11,10,10。
  • 从第二堆取 1 张牌放到第一堆,此时每堆纸牌数分别为 10,10,10,10。

思路点拨

首先,我们得知道每堆牌应有多少张。题目保证了总牌数是堆数的倍数,那么最终每一堆的牌数应该是(a[1]+a[2]+……+a[N])/N,也就是N堆牌的平均数

比如有4堆牌,分别是有2、3、4、7张,而平均数就是4,也就是最后每堆牌所分得的张数。

每一堆牌的张数只可能有三种情况:

1.比平均值小:少几张,就让右边的一堆给几张。

2.和平均值相同:不需要给,判断下一个。

3.比平均值大:多几张,就把多的给右边。

情况一时,右边一堆的张数可能会出现负数,但没有关系,最终还是会有其他堆补回来的。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int n,a[maxn],cnt;
int main()
{
    int mean,sum=0;
	cin>>n;
	for(int i=1;i<=n;i++)
    {
		cin>>a[i];
		sum+=a[i];
	}
	mean=sum/n; //☆总和÷堆数=平均每堆牌数 
	for(int i=1;i<=n-1;i++)
	{
		if(a[i]!=mean) 
        {
			a[i+1]+=a[i]-mean;//a[i]少的话会加上负数,相当于减少右边的牌
			cnt++;
		}
	}
	cout<<cnt<<endl;
	return 0;
}

洛谷 P1094 纪念品分组

题目网址:[NOIP2007 普及组] 纪念品分组 - 洛谷 

题目描述

元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

样例输入

100 
9 
90 
20 
20 
30 
50 
60 
70 
80 
90

样例输出 

6

思路点拨

相信各位都学过首尾配对吧,比如计算下面这道题:

1+2+3+4+5+6+7+8+9

除了利用公式计算,我们还可以首尾配对,观察首和尾,很容易想到1+9=10,而总共有4组余下一个5,即4×10+5=45。

而这一题要尽可能的平均不就是首尾配对吗?但要注意一点,不能超过给定范围

既然要首尾配对,首先得排个序吧,这就要用到我们学过的sort函数了。

接着我们分析一下样例,先把样例排序一下:

20 20 30 50 60 70 80 90 90 

利用配对的思想:最小+最大=20+90=110,超过了限制,也就是说,最大的只能单独一个组。

再次利用配对的思想:最小+第二大=20+90=110,还是大了,第二大也只能单独一组。

再次利用配对的思想:最小+第三大=20+80=100,没有超过限制,可以为一组。

再次利用配对的思想:第二小+第四大=20+70=90,没有超过限制,可以为一组。

以此类推,我们便可得出答案。

而模拟两边不断往里缩小范围的不就是指针吗!上代码!

AC代码

#include<bits/stdc++.h>
using namespace std;
int n, w, ans;
int a[30010];
int main() 
{
    cin>>w>>n;
    for (int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);//要想配对,先排序
    int i=1,j=n;//i,j为两个指针
    while(i<=j) 
    {
        if (a[i]+a[j]<=w)//两个纪念品可以为一组
        {
            i++;
            j--;
            ans++;
        } 
        else//最大单独为一组
        {
            j--;
            ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}


洛谷 P2660 zzc 种田 

题目网址:zzc 种田 - 洛谷

题目描述

田地是一个巨大的矩形,然而 zzc 每次只能种一个正方形,而每种一个正方形时 zzc 所花的体力值是正方形的周长,种过的田不可以再种,zzc 很懒还要节约体力去泡妹子,想花最少的体力值去种完这块田地,问最小体力值。

思路点拨

很明显的一道贪心题,要想耗费力气最小,肯定是每次划分尽可能大的正方形。

比如2×2的一个田地,如果你划分成4个1×1的需要周长:1×4×4=16cm

而划分成1个2×2的只需要周长:2×4=8cm

所以,贪心策略是:每次划分尽可能大的正方形。 

对于3×5的正方形,最省力气的划分如下:

注意:最大的正方形应该已较短的一条边作为边长。

90分 

#include<bits/stdc++.h>
using namespace std; 
typedef long long ll;
signed main()
{
	ll x,y,l,ans=0;
	cin>>x>>y;
	l=x*y;//l为剩余面积
	if(x>y) swap(x,y);//始终保持小的是x
	while(l!=0)
	{
		l-=x*x;//画一个尽可能大的正方形
		y-=x;
		ans+=x*4;
		if(x>y) swap(x,y);
	}
	cout<<ans<<endl;
}

优化:不一定一个一个地划分,可以一起划分。 

AC Code

#include<bits/stdc++.h>
using namespace std; 
typedef long long ll;
signed main()
{
	ll x,y,ans=0;
	cin>>x>>y;
	if(x>y) swap(x,y);
	while(x!=0&&y!=0)
	{
		ans+=x*4*(y/x);
		y%=x;
		swap(x,y);
	}
	cout<<ans<<endl;
}

结尾

本节课我们精讲了三道题,记得去洛谷完成哦!

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

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

相关文章

代码随想录 Leetcode435. 无重叠区间

题目&#xff1a; 代码(首刷看解析 2024年2月17日&#xff09;&#xff1a; class Solution { private:const static bool cmp(vector<int>& a,vector<int>& b) {return a[0] < b[0];} public:int eraseOverlapIntervals(vector<vector<int>&…

离线数仓(二)【用户行为日志采集平台搭建】

用户行为日志采集平台搭建 1、用户行为日志概述 用户行为日志的内容&#xff0c;主要包括用户的各项行为信息以及行为所处的环境信息。收集这些信息的主要目的是优化产品和为各项分析统计指标提供数据支撑。收集这些信息的手段通常为埋点。 目前主流的埋点方式&#xff0c;有代…

C++文件操作->文本文件(->写文件、读文件)、二进制文件(->写文件、读文件)

#include<iostream> using namespace std; #include <fstream>//头文件包含 //文本文件 写文件 void test01() { //1.包含头文件 fstream //2.创建流对象 ofstream ofs; //3.指定打开方式 ofs.open("test.txt", ios::out); //4.写…

【杂谈】裁我?我是研发,我是研发啊!

闲谈 这两年互联网是越来越不太平了&#xff0c;前有国外互联网裁员的妖风四起&#xff0c;后来寒气又传到国内&#xff0c;让我们这群打工人叫苦连天。最近有部电影蛮火的&#xff0c;叫《年会不能停》&#xff0c;感觉跟我前司很相似&#xff0c;不过好像由于今年业绩不太行…

第1集《佛遗教经》

《佛遗教经》和尚尼慈悲&#xff0c;诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01;好&#xff0c;请放掌。 我们从今天开始有六个讲次&#xff0c;跟大家共同学习《佛遗教经》。在正式讲这部经之前&#xff0c;我想先简单的说明本经的特色。 身为一个佛弟子&#xff0…

OpenCV-40 绘制直方图

一、使用matplotlib画直方图 可以利用matplotlib把OpenCV统计得到的直方图绘制出来 示例代码如下&#xff1a; import cv2 import matplotlib.pyplot as pltlena cv2.imread("beautiful women.png") # 变为黑白图片 gray cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY…

《Linux 简易速速上手小册》第8章: 安全性与加固(2024 最新版)

文章目录 8.1 防火墙与安全策略8.1.1 重点基础知识8.1.2 重点案例&#xff1a;配置 iptables 以保护 Web 服务器8.1.3 拓展案例 1&#xff1a;使用 firewalld 配置动态防御区域8.1.4 拓展案例 2&#xff1a;配置 ufw 以简化管理 8.2 SSH 安全最佳实践8.2.1 重点基础知识8.2.2 重…

人工智能学习与实训笔记(六):神经网络之智能推荐系统

人工智能学习笔记汇总链接&#xff1a;人工智能学习与实训笔记汇总-CSDN博客 本篇目录 七、智能推荐系统处理 7.1 常用的推荐系统算法 7.2 如何实现推荐 7.3 基于飞桨实现的电影推荐模型 7.3.1 电影数据类型 7.3.2 数据处理 7.3.4 数据读取器 7.3.4 网络构建 7.3.4.1…

vue-ESlint (六)

代码规范 代码规范&#xff1a;一套写代码的约定规则。例如&#xff1a;"赋值符号的左右是否需要空格" "一句结束是否是要加;" . 老话说&#xff1a;"没有规矩不成方圆" → 正规的团队 需要 统一的编码风格 JavaScript Standard Style 规范说…

成本效能FinOps: Crane 部署

目录 一、实验 1.环境 2.安装kind 3.安装Crane 二、问题 1.脚本安装prometheus报错 2.查看集群信息失败 3.Helm添加grafana 报错 4.查看crane资源失败 5.prometheus部署时kube-state-metrics 拉取镜像显示ImagePullBackOff 6.Crane 功能与架构 一、实验 1.环境 &a…

智慧公厕的主要应用

在现代社会中&#xff0c;随着城市化进程的加速推进&#xff0c;公共卫生设施的建设和管理变得愈加重要。而智慧公厕作为一种新型城市公共设施&#xff0c;正以其智能化、高效化的特点&#xff0c;成为改善城市卫生环境的重要手段。智慧公厕运用物联网、互联网、大数据、云计算…

HAL/LL/STD STM32 U8g2库 +I2C SSD1306/sh1106 WouoUI磁贴案例

HAL/LL/STD STM32 U8g2库 I2C SSD1306/sh1106 WouoUI磁贴案例 &#x1f4cd;基于STM32F103C8T6 LL库驱动版本&#xff1a;https://gitee.com/chcsx/platform-test/tree/master/MDK-ARM&#x1f3ac;视频演示&#xff1a; WouoUI移植磁贴案例&#xff0c;新增确认弹窗 &#x1f…

无人驾驶LQR控制算法 c++ 实现

参考博客&#xff1a; &#xff08;1&#xff09;LQR的理解与运用 第一期——理解篇 &#xff08;2&#xff09;线性二次型调节器(LQR)原理详解 &#xff08;3&#xff09;LQR控制基本原理&#xff08;包括Riccati方程具体推导过程&#xff09; &#xff08;4&#xff09;【基础…

精品jsp+ssm鲜花销售管理系统-购物商城

《[含文档PPT源码等]精品jspssm鲜花销售管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#x…

微信小程序如何配置服务器域名

目录 一、微信小程序 二、域名 三、服务器 四、如何配置服务器域名 一、微信小程序 微信小程序是一种轻量级的应用程序&#xff0c;用户无需下载安装即可使用&#xff0c;具有便捷、快捷的特点。微信小程序可以在微信内直接使用&#xff0c;无需离开微信即可完成各种功能&…

Leetcode - 周赛384

目录 一&#xff0c;3033. 修改矩阵 二&#xff0c;3035. 回文字符串的最大数量 三&#xff0c;3036. 匹配模式数组的子数组数目 II 一&#xff0c;3033. 修改矩阵 这道题直接暴力求解&#xff0c;先算出每一列的最大值&#xff0c;再将所有为-1的区域替换成该列的最大值&am…

人工智能学习与实训笔记(七):神经网络之推荐系统处理

九、模型压缩与知识蒸馏 出于对响应速度&#xff0c;存储大小和能耗的考虑&#xff0c;往往需要对大模型进行压缩。 模型压缩方法主要可以分为以下四类&#xff1a; 参数修剪和量化&#xff08;Parameter pruning and quantization&#xff09;&#xff1a;用于消除对模型表…

Java 学习和实践笔记(12)

这个就比较有意思了&#xff01;所有的事情&#xff0c;拆分完之后&#xff0c;都有且只有这三种状态流程&#xff01; //TIP To <b>Run</b> code, press <shortcut actionId"Run"/> or // click the <icon src"AllIcons.Actions.Execute&…

Vue源码系列讲解——模板编译篇【二】(整体运行流程)

目录 1. 整体流程 2. 回到源码 3. 总结 1. 整体流程 上篇文章中我们说了&#xff0c;在模板解析阶段主要做的工作是把用户在<template></template>标签内写的模板使用正则等方式解析成抽象语法树&#xff08;AST&#xff09;。而这一阶段在源码中对应解析器&…

《区块链公链数据分析简易速速上手小册》第7章:数据获取和分析的挑战(2024 最新版)

文章目录 7.1 数据准确性和完整性验证7.1.1 基础知识7.1.2 重点案例&#xff1a;验证加密货币交易数据准备工作实现步骤步骤1: 从 API 获取比特币交易数据步骤2: 数据转换和初步校验步骤3: 验证交易数据的格式和范围 结论 7.1.3 拓展案例 1&#xff1a;使用哈希校验数据完整性准…