【全网首发】洛谷贪心题解集合

贪心

1.P2240 【深基12.例1】部分背包问题

【深基12.例1】部分背包问题 - 洛谷

思路

万不要被题目给误导了,这道题是贪心。

所有金币都可以分开,也就是说只要按照性价比最高的取一定得到的价值最大。

性价比就是这堆金币的价值除以重量。

只需要把这n堆金币按性价比排序就行了。

然后依次遍历,如果背包中剩余可以拿的重量大于等于这堆金币的重量,就全拿,否则直接装满。

直接装满这里注意一下整型转浮点的细节就好了。

AC

#include<bits/stdc++.h>
using namespace std;
double ans,t;
struct gold{double m,r;
}a[105];
bool cmp(gold u,gold v){return u.r>v.r;
}
int n;
int main(){cin>>n>>t;for(int i=1;i<=n;i++){double x,y;cin>>x>>y;a[i].m=x;a[i].r=y/x;}sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){if(a[i].m<t){t-=a[i].m;ans+=a[i].r*a[i].m;}else{ans+=t*a[i].r;break;}}printf("%.2f",ans);return 0;
}

2.P1803 凌乱的yyy / 线段覆盖

凌乱的yyy / 线段覆盖 - 洛谷

思路

这道题考查的应该是贪心, 贪心的地方在于每次都选择结束时间最早的那场比赛,最后的参赛次数应该是最高的(详情请见其他dalao的题解),所以代码就十分简单了,利用sort快排把结束顺序从小到大排列,然后根据上场比赛的结束时间和本场比赛的开始时间一一检查能否参加就可以了。

AC

#include<bits/stdc++.h>
#define f first //将first用f表示
#define s second//将second用s表示
using namespace std;
typedef pair<int,int>pi;
int const m=1e6+5;
pi a[m];
int n;
int main(){cin>>n;for(int i=0;i<n;i++){cin>>a[i].s>>a[i].f;}sort(a,a+n);int last=0,ans=0;for(int i=0;i<n;i++){if(a[i].s>=last){ans++;last=a[i].f;}}cout<<ans<<endl;return 0;
}

3.P1190 [NOIP2010 普及组] 接水问题

[NOIP2010 普及组] 接水问题 - 洛谷

思路

首先,我们理解了题目,哪个人装完水之后,就轮到队伍的下一个人来接水.So,下一个来接水的人,一定是去当前装水的m个人中最快的那个人的位置继续装水.

Then,我们就可以从第m+1个人开始帮他找位置(PS:为什么不是从第一个人开始?因为前m个人已经在装水了,他们的位置随便定(写程序的时候不用管)).因为要去速度最快的那个人的位置,所以,到那个位置装水的人的时间之和也是最短的!

那么,我们就可以利用数组中前m个位置来储存相对应位置接水的人时间之和.这样的话,每次就可以先找m个接水位置中,当前时间之和最短的来装水(即把a[i]加到a[1](当前总用时最短的位置)),就OK啦!

最后,再看一下前m个位置中那个用的时间是最短的,cout就可以完成啦!

AC

#include<bits/stdc++.h>
using namespace std;
int s[11000],ans; 
int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>s[i];}int t=m+1;while(t<=n+m){for(int i=1;i<=m;i++){s[i]--;if(s[i]==0){s[i]=s[t];t++;}}ans++;}cout<<ans;return 0;
}

4.P1080 [NOIP2012 提高组] 国王游戏

[NOIP2012 提高组] 国王游戏 - 洛谷

思路

看到这道题的使得获得奖赏最多的大臣,所获奖赏尽可能的少,我的第一想法是二分答案。但是又仔细想了想,答案不具有单调性,二分是行不通的。

再看看这道题,我感觉可以用贪心来做。也就是说先用贪心确定一种最优的方案,再在这个排列队伍中求得答案。

可以这样思考,相邻两个的人交换对于前面的人答案没影响(这不是废话么),而且对于后面的人答案也没有影响(这里很关键)。也就是说相邻两人的位置交换只会对这两个人产生影响。那么我们就先考虑这两个人。

设这两个人分别为i和i+1。左手数字为a[i]和a[i+1],右手数字为b[i]和b[i+1]。两人的金币数为w[i]和w[i+1]。

记P[i]=a[1]*a[2]a[3]...*a[i]

可得:

w[i]=P[i-1]/b[i];

w[i+1]=P[i]/b[i+1];

又P[i]=P[i-1]*a[i]

那么 w[i+1]=P[i-1]*a[i]/b[i+1]=w[i]*a[i]*b[i]/b[i+1]

不难看出,在这个相邻的二元组中,前面的数不受后面的影响,而后面的金币数决定于w[i],a[i],b[i]。

推广到整个排队方案,前面的金币数和a[i],b[i]都会影响后面的答案。贪心原则便出来了:按a[i]*b[i]为关键字从小到大排序,相同的顺序无所谓。最后再扫一遍,算出答案即可。

此题需要注意一点:乘除法都要写高精度,且答案有10000多位。

AC

#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
string hmul(string a,string  b){int c[500005];memset(c,0,sizeof c);int x[a.size()],y[b.size()];memset(x,0,sizeof x);memset(y,0,sizeof y);for(unsigned int i=0;i<a.size();i++)x[a.size()-1-i]=a[i]-'0';for(unsigned int i=0;i<b.size();i++)y[b.size()-i-1]=b[i]-'0';for(unsigned int i=0;i<a.size();i++){for(unsigned j=0;j<b.size();j++){c[i+j]+=x[i]*y[j];}}for(unsigned int i=0;i<a.size()+b.size();i++){if(c[i]>=10){c[i+1]+=c[i]/10;c[i]%=10;}}string ci;bool p=1;for(int i=a.size()+b.size()-1;i>=0;i--){if(c[i]==0&&p) continue;else{p=0;ci+=c[i]+'0';}}return ci;
}
string hdiv(string a,int b){int x[50005];int y[50005];memset(x,0,sizeof(x));memset(y,0,sizeof(y));for(unsigned int i=0;i<a.size();i++){x[i+1]=a[i]-'0';}int yu=0;for(unsigned int i=1;i<=a.size();i++){y[i]=(yu*10+x[i])/b;yu=(yu*10+x[i])%b;}int kk=1;while(y[kk]==0&&kk<a.size()) kk++;string aa;for(unsigned int i=kk;i<=a.size();i++){aa+=y[i]+'0';}return aa;
}
string smx(string a,string b){if(a.size()!=b.size()) return a.size()>b.size()?a:b;return a>b?a:b;
}
string tur_str(int num){string str;while(num){str+=num%10+'0';num/=10;}reverse(str.begin(),str.end());return str;
}
int n;
struct aa{int l,r;
}a[100005];
bool cmp(aa a,aa b){return (a.l*a.r)<(b.l*b.r);
}
int main(){cin>>n;cin>>a[0].l>>a[0].r;for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r;sort(a+1,a+n+1,cmp);string ans="0";string xx=tur_str(a[0].l);for(int i=1;i<=n;i++){ans=smx(ans,hdiv(xx,a[i].r));xx=hmul(xx,tur_str(a[i].l));}cout<<ans<<endl;return 0;
}

​​​​​

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

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

相关文章

85双指针解三数之和

问题描述&#xff1a;给你一个包含n个整数的数组nums&#xff0c;判断nums中是否勋在三个元素a,b,c使得abc0,请你找出所有和为0且不重复的三元组。 求解思路&#xff1a;如果使用for循环的方式&#xff0c;n3的时间复杂度&#xff0c;可以采用双指针的方式&#xff0c;先将整个…

企业级大数据架构设计

企业级大数据架构设计 企业级大数据架构设计 又名&#xff1a; 学习大数据概念&#xff0c; 写框架&#xff08;第1天&#xff09; 数据架构与设计&#xff1a;概述与设计考虑 引言数据架构概述设计考虑因素构建数据架构的步骤 大数据的核心架构内容&#xff1a;构建高效和…

14.用户管理

目录 1、权限表 1、user表 1.用户列 2.权限列 3.安全列 4.资源控制列 2、db表和host 表 1.用户列 2.权限列 3. tables_priv 表和 columns _priv 表 4.procs_priv 表 2、账户管理 1. 登录和退出MySQL服务器 2、创建普通用户&#xff1a; 1.使用CREATE USER语创建…

前端crypto-js 库: MD5

文章目录 什么是crypto-js安装依赖MD5 什么是crypto-js github地址: https://github.com/brix/crypto-js cryptojs文档: https://cryptojs.gitbook.io/docs/#encoders CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。 CryptoJS是一个JavaScript加密算法库&a…

免费的CISSP备考学习网站

CISSP&#xff08;Certified Information Systems Security Professional&#xff09;是一项高级的信息安全认证&#xff0c;官方认证机构是(ISC)。虽然(ISC) 提供了官方培训资料&#xff0c;但是很多学习资料都是商业性质的&#xff0c;需要付费购买。尽管如此&#xff0c;仍然…

基于Java SSM框架实现健康管理系统项目【项目源码】

基于java的SSM框架实现健康管理系统演示 JSP技术 JSP是一种跨平台的网页技术&#xff0c;最终实现网页的动态效果&#xff0c;与ASP技术类似&#xff0c;都是在HTML中混合一些程序的相关代码&#xff0c;运用语言引擎来执行代码&#xff0c;JSP能够实现与管理员的交互&#xf…

二分算法

目录 二分 数的三次方根 算法模板 二分 给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q 个查询。 对于每个查询&#xff0c;返回一个元素 k 的起始位置和终止位置&#xff08;位置从 00 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1…

pycharm配置pyrcc5外部工具

pyrcc5这是 PyQt5 中用来将资源文件&#xff08;.qrc&#xff09;转换为 Python 文件的工具。类似地&#xff0c;如果你想在 PyCharm 中配置 pyrcc5 将 .qrc 文件转换为 .py 文件的外部工具&#xff0c;你可以遵循以下步骤&#xff1a; 打开 PyCharm 的设置: 选择 File > Se…

GO语言基础笔记(九):工程实践

单元测试&#xff08;Unit Testing&#xff09; 单元测试是指对软件中的最小可测试单元进行检查和验证。在Go语言中&#xff0c;可以使用内置的testing包来进行单元测试。进行单元测试时&#xff0c;您应该关注以下几个要点&#xff1a; 测试代码的独立性&#xff1a;确保每个…

P1163 银行贷款

P1163 银行贷款 P1163 银行贷款 题意 1.从银行贷款后&#xff0c;在一段时间内每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。 2.三个用空格隔开的正整数。第一个整数表示贷款的原值n&#xff0c;第二个整数表示每月支付的分期付款金…

解决idea文件properties中文乱码问题

解决idea文件properties中文乱码问题_idea properties文件中文乱码-CSDN博客

[react]脚手架create-react-app/vite与reac项目

[react]脚手架create-react-app/vite与reac项目 环境问题描述create-react-app 脚手架根据脚手架修改项目结构安装脚手架注入配置文件-config文件夹package.json文件变更删除 serviceWorker.js新增reportWebVitals.js文件更新index.js文件 脚手架creat-react-app 缺点 vite 脚手…

基于Springboot实现天天生鲜销售电商平台

SSM毕设分享 基于Springboot实现天天生鲜销售电商平台 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数&#xff1a;3分 …

中文字符占用字节即相关原理(实现中文(中英混合)字符串的反转)

如有不对欢迎指正。 目录 一.ASCLL字符和中文字符 1.使用无符号数表示的原因(对于中文字符)&#xff1a; 2.但是并不是所有情况都是用无符号数(以下目前只是猜测,如有问题欢迎指正) &#xff1a; 1. 什么时候使用无符号数表示: 2. 不需要使用的情况&#xff1a; …

vue源码(一)

搭建环境 获取地址&#xff1a;GitHub - vuejs/vue: This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/core 安装依赖&#xff1a;npm i 安装 rollup&#xff1a; npm i -g -rollup 修改dev脚本&#xff1a;添加 --sourcemap "dev": &q…

【最优化方法】精确一维搜索方法

文章目录 0.618 法示例 Newton 法示例 0.618 法 0.618 法是一种一维线性搜索的算法&#xff0c;也称为黄金分割法&#xff08;Golden Section Method&#xff09;。它是一种迭代方法&#xff0c;用于确定目标函数在一个区间上的最小值。 以下是 0.618 法的基本步骤&#xff1…

Access数据库C#读写验证

1、数据库简介 Access数据库是一个相当古老的文件型数据库&#xff0c;主打一个简单方便&#xff0c;没有复杂的安装过程&#xff0c;没有庞大的后端管理&#xff0c;整个数据库就是一个文件。可以像普通文件一样复制和修改&#xff0c;可以同时读写。 在小型系统中&#xff0c…

子组件如果向父组件传递数据是怎么做到

在 Vue.js 中&#xff0c;子组件向父组件传递数据可以通过自定义事件来实现。子组件可以通过 $emit 方法触发一个自定义事件&#xff0c;并且可以传递数据给父组件。 下面是一个示例&#xff0c;演示了子组件向父组件传递数据的过程&#xff1a; <!-- ParentComponent.v…

Xgboost分类模型的完整示例

往期精彩推荐 数据科学知识库机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归PySpark大数据处理详细教程 定义问题 UCI的蘑菇数据集的主要目的是为了分类任务&#xff0c;特别是区分蘑菇是可食用还是有毒。这个数据集包含了蘑菇的各种特征&#xff0c;如…

【读书笔记】网空态势感知理论与模型(四)

一个网空态势感知整合框架 1. 引言 网空态势感知过程可以看作包含态势观察、态势理解和态势预测3个阶段。 态势观察&#xff1a;提供环境中相关元素的状态、属性和动态信息。 态势理解&#xff1a;包括人们如何组合、解释、存储和留存信息。 态势预测&#xff1a;对环境&a…