秒懂百科,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);//始终保持小的是xwhile(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;
}

结尾

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件管理大师:深入解析Linux的文件与目录操控

目录 一、文件命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名大小写 4、Linux文件扩展名 二、文件管理命令 1、目录创建/删除 mkdir创建目录 直接创建文件夹 创建多个文件夹 递归创建写法 总结mkdir 删除空目录 2、文件创建、删除 touch创建文…

【图像分割 2024】ParaTransCNN

【图像分割 2024】ParaTransCNN 论文题目&#xff1a;ParaTransCNN: Parallelized TransCNN Encoder for Medical Image Segmentation 中文题目&#xff1a;用于医学图像分割的并行TransCNN编码器 论文链接&#xff1a;https://arxiv.org/abs/2401.15307 论文代码&#xff1a;H…

UI风格汇:毛玻璃风格风靡的原因解读

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;主要讲解各类UI风格特征、辨识方法、应用场景、运用方法等&#xff0c;本次带来的是毛玻璃风格的解读&#xff0c;有设计需求可以私聊。 一、什么是毛玻璃风格 毛玻璃风格&#xff08;Fros…

(08)Hive——Join连接、谓词下推

前言 Hive-3.1.2版本支持6种join语法。分别是&#xff1a;inner join&#xff08;内连接&#xff09;、left join&#xff08;左连接&#xff09;、right join&#xff08;右连接&#xff09;、full outer join&#xff08;全外连接&#xff09;、left semi join&#xff08;左…

鸿蒙系统优缺点,能否作为开发者选择

凡是都有对立面&#xff0c;就直接说说鸿蒙的优缺点吧。 鸿蒙的缺点&#xff1a; 鸿蒙是从2019年开始做出来的&#xff0c;那时候是套壳Android大家都知晓。从而导致大家不看鸿蒙系统&#xff0c;套壳Android就是多次一举。现在鸿蒙星河版已经是纯血鸿蒙&#xff0c;但是它的…

高性能MySQL 阅读笔记

mysql由服务器端与存储引擎两部分组成&#xff0c;存储引擎部分的锁机制对服务器端是透明的。服务器端内置缓存机制&#xff0c;有解析器和优化器机制。不同的存储引擎对事务、并发等都用不同的处理。 ACID代表的特性&#xff1a;原子性、一致性、隔离性、持久性 共享锁与排他…

【Web】CTFSHOW java刷题记录(全)

目录 web279 web280 web281 web282 web283 web284 web285 web286 web287 web288 ​web289 web290 web291 web292 web293 web294 web295 web296 web297 web298 web299 web300 web279 题目提示 url里告诉我们是S2-001 直接进行一个exp的搜 S2-001漏洞分析…

网络安全最典型基础靶场-DVWA-本地搭建与初始化

写在前面&#xff1a; 之前也打过这个 DVWA 靶场&#xff0c;但是是在虚拟机环境下的一个小块分区靶场&#xff1b; 本篇博客主要介绍在本地搭建 DVWA 靶场以及靶场的初始化&#xff0c;后续会陆续更新通关教程。 由于我们是在本地搭建&#xff0c;则需要基于你已经装好 phpstu…

C++数据结构与算法——双指针法

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Windows 连接共享文件夹 切换/退出账号操作

工作中遇到个问题&#xff0c;登录公司内部共享文件夹&#xff0c;使用自己的账号&#xff0c;但需要切换别人账号找东西时&#xff0c;没有发现登出的地方。在网上找了两种方法&#xff1a;通过命令行登出账号的方法 &#xff08;1&#xff09;打开cmd命令提示符&#xff0c;…

MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(3)-系统数据集合设计

前言 前几章教程我们把ToDoList系统的基本框架搭建好了&#xff0c;现在我们需要根据我们的需求把ToDoList系统所需要的系统集合&#xff08;相当于关系型数据库中的数据库表&#xff09;。接下来我们先简单概述一下这个系统主要需要实现的功能以及实现这些功能我们需要设计那些…

快速部署MES源码/万界星空科技开源MES

什么是开源MES软件&#xff1f; 开源MES软件是指源代码可以免费获取、修改和分发的MES软件。与传统的商业MES软件相比&#xff0c;开源MES软件具有更高的灵活性和可定制性。企业可以根据自身的需求对软件进行定制化开发&#xff0c;满足不同生产环境下的特定需求。 开源MES软件…