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

这篇具有很好参考价值的文章主要介绍了秒懂百科,C++如此简单丨第二十天:贪心算法2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Everyday English

前言

洛谷 P1031 均分纸牌

题目描述

思路点拨

AC代码

洛谷 P1094 纪念品分组

题目描述

样例输入

样例输出 

思路点拨

AC代码

洛谷 P2660 zzc 种田 

题目描述

思路点拨

AC Code

结尾


Everyday English

Don't miss the opportunity.

机不可失,时不再来。

前言

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

贪心算法1:贪心算法第一节课

洛谷 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的正方形,最省力气的划分如下:

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

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

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;
}

结尾

本节课我们精讲了三道题,记得去洛谷完成哦!文章来源地址https://www.toymoban.com/news/detail-829094.html

到了这里,关于秒懂百科,C++如此简单丨第二十天:贪心算法2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++学习第二十天----简单文件输入/输出

    1.写入到文本文件中         必须声明自己的ofstream对象,为其命名,并将其同文件关联起来;         方法open()接受一个c-风格字符换作为参数,可以是一个字面字符串,也可以是存在数组中的字符串。         声明一个ofstream对象并将其同文件关联起来后,用于

    2024年02月11日
    浏览(33)
  • 学习JAVA的第二十天(基础)

    目录 字符集  编码和解码 字符流 FileReader FileWriter 缓冲流  字节缓冲流 字符缓冲流 转换流                                                               序列化流         反序列化流   打印流 字节打印流   字符打印流 解压缩流                           

    2024年03月15日
    浏览(42)
  • 【MySQL进阶之路丨第二篇】数据库的安装与配置

    下载地址:MySQL下载地址 进入网址后,点击 MySQL Community Server : 选择版本: 我们选择历史版本中的5.7.24版本 安装到D盘的MySQL文件夹中 解压后复制bin目录路径 在系统变量的Path中添加bin目录路径 接着在D:SoftwareMySQLmysql-5.7.24-winx64目录下新增加一个配置文件mysql.ini和一个data文

    2024年02月10日
    浏览(33)
  • 【微信小程序丨第二篇】小程序的基本目录结构与文件作用剖析

    小程序框架的⽬标是通过尽可能简单、⾼效的⽅式让开发者可以在微信中开发具有原⽣APP体验的服务。 ⼩程序框架提供了⾃⼰的视图层描述语⾔ WXML 和 WXSS ,以及 JavaScript ,并 在视图层与逻辑层间提供了数据传输和事件系统 ,让开发者能够专注于数据与逻辑。 传统web 微信

    2024年02月09日
    浏览(33)
  • 30天精通Nodejs--第二十天:express-操作mysql

    在Node.js中使用Express框架进行开发时,经常会需要持久化数据,与关系型数据库MySQL的集成是至关重要的一步。本文将详细阐述如何在Express项目中连接MySQL数据库,并通过实例代码演示如何执行基本的增删改查(CRUD)操作。

    2024年01月18日
    浏览(29)
  • 【C++刷题】经典简单题第二辑

    回文排列 URL化 配对交换 递归乘法 阶乘尾数 二进制链表转整数 从链表中删去总和值为零的连续节点 括号的最大嵌套深度 整理字符串 奇偶树 将句子排序 最长和谐子序列

    2024年02月09日
    浏览(31)
  • 【三十天精通Vue 3】 第二十二天 Vue 3的UI框架详解

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3

    2024年02月02日
    浏览(34)
  • 【三十天精通Vue 3】第二十一天 Vue 3的安全性详解

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3

    2024年02月01日
    浏览(41)
  • 【Spring进阶系列丨第二篇】Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)

    我们都知道Spring 框架主要的优势是在 简化开发 和 框架整合 上,至于如何实现就是我们要学习Spring 框架的主要内容,今天我们就来一起学习Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)。 以经典的三层架构MVC作为案例,以前我们都是这么干的,看如下代码: 按照

    2024年02月05日
    浏览(58)
  • 【三十天精通Vue 3】第二十七天 如何用Vue 3和TensorFlow.js实现人脸识别Web应用?

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包