当前位置: 首页 > news >正文

贪心:保卫花园

题目:P2878 [USACO07JAN] Protecting the Flowers S - 洛谷

题目概述:每头牛都呆在数组的某个坐标上,并且每分钟会吃掉i朵花,问如何排序把牛牵回坐标0处,使花的损失最小。求最小吃掉花的数量。

思路:每一波吃掉花的数量 = 其他奶牛的总吃草量 * 这头选中的奶牛走到坐标0的时间。因此,最终结果其实就是确定“牵牛”的顺序。

因此,就是对所有的奶牛排序,最重要的就是找出排序规则。

推导规律(重要)

  • 在确定好 (假设确定好) 顺序的序列中,拿出相邻的两个元素
  • 如果交换这两个元素,对前面以及后面确定好顺序的序列的结果不造成影响
  • 此时就可以根据这两个元素交换前后的结果,推导出排序的规则

执行1:拿出相邻的 奶牛,j,和一头奶牛,i,

执行2:如果这两头奶牛交换牵走的顺序,对 j 前面所有奶牛的总吃草量有没有影响?对 i 后面所有奶牛的总吃草量有没有影响? 没有影响。

  •         i 和 j 交换顺序,都不影响前面先吃,一直吃到 i 和 j ...... 对前面没有影响。
  •         虽然i和j交换顺序,但i 和 j 吃草的总时间没有变,所以对后面也没有影响。

执行3:推导排序规则

把它们同时除以 dj di,可以变形为:tᵢ / dᵢ < tⱼ / dⱼ

这个不等式的含义是:​​任务 i的“单位损失” (tᵢ / dᵢ) 小于任务 j的“单位损失” (tⱼ / dⱼ)​​。

单位损失越大,紧急度越高。

总代码:

#include <iostream>
#include <algorithm>using namespace std;
typedef long long LL;
const int N = 1e5 + 10;int n; 
LL sum = 0, ret = 0;struct node
{int t;int d;
}a[N];bool cmp(node& x, node& y)
{return x.t * y.d < y.t * x.d;
}int main()
{cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i].t >> a[i].d;sum += a[i].d;                //记录所有的吃草量}sort(a+1, a+1+n, cmp);for (int i = 1; i <= n; i++){sum -= a[i].d;                //减去每回合的补救ret += a[i].t*2*sum;}cout << ret << endl;return 0;
} 

时间复杂度为O(n log n) 。

复习sort函数:

cmp函数接受两个参数(通常是相邻或需要比较的元素),并返回一个布尔值:

  • ​如果返回 true​:表示第一个参数 (x) ​​应该排在​​ 第二个参数 (y) ​​之前​​。

  • ​如果返回 false​:表示第一个参数 (x) ​​不应该排在​​ 第二个参数 (y) ​​之前​​(即 y应该排在 x之前,或者它们的顺序无关紧要)。

你可以把 cmp(x, y)理解为回答一个问题:​​“为了让数组是我想要的样子,x必须排在 y前面吗?”​

  • 如果 x.t * y.d < y.t * x.d为 true​:

    函数返回 true,告诉 sort函数:​​“是的,为了让数组有序,x必须排在 y前面。”​

  • ​如果 x.t * y.d < y.t * x.d为 false​:

    函数返回 false,告诉 sort函数:​​“不,x不必排在 y前面。”​​ (这意味着 y可能会被放到 x前面)。

模板:

想要的效果(对数组进行排序)

你应该书写的 cmp函数

解释

​升序(从小到大)​
例如: [1, 2, 3, 4]

return x < y;

如果 x小于 y,那 x就应该排在前面,结果就是从小到大。

​降序(从大到小)​
例如: [4, 3, 2, 1]

return x > y;

如果 x大于 y,那 x就应该排在前面,结果就是从大到小。

​按结构体中某个字段升序​
例如:按 score从小到大

return x.score < y.score;

如果 x的分数小于 y的分数,x排前面。

​按结构体中某个字段降序​
例如:按 score从大到小

return x.score > y.score;

如果 x的分数大于 y的分数,x排前面。

http://www.dtcms.com/a/415861.html

相关文章:

  • 东莞专业微网站建设价格哪个浏览器可以进wordpress
  • HashMap和Hashtable
  • 做个网站得花多少钱建成区违法建设治理网站
  • 革新深层水平位移监测——安锐科技推出全新节段式位移计,以模块化设计显著降低成本
  • 赣州企业网站在那做网站域名的管理密码如何索取
  • 网站建设与管理大纲天津科技公司网站
  • 网站开发与维护是什么企业网站需要什么功能
  • 【有源码】基于python+spark的餐饮外卖平台综合分析系统-基于Hadoop生态的外卖平台数据治理与分析系统
  • 【心力建设】《毛选》里的心法
  • 浙江网站建设有哪些合肥seo排名优化
  • 如何制作课程网站模板用python做网站的步骤
  • 光纤测温技术:原理与应用全解析
  • ICICLE-Snark:目前最快的 Groth16 实现
  • 做网站建设的公司seo优化网站推广
  • 网站原型设计和版式设计湖南手机版建站系统开发
  • 黔南网站建设做网站多大上行速度
  • m 外贸网站阿里巴巴可以做公司网站吗
  • 太仓网站建设有限公司网站备案域名证书
  • 家用机做网站服务器企业网站多大空间
  • 网站做sem优化全国卫生机构建设管理系统网站
  • 优质网站建设价格天津网站建设哪里好
  • 建设银行网站号圣诞网站源码
  • 多合一网站建设网站漂浮
  • 金华高端网站设计wordpress图片主题模板下载
  • 昌吉网站建设电话菠萝蜜影视传媒有限公司
  • 谷歌建站哪家好企业免费建站网站
  • 10. C++ 类—构造函数
  • 网站建设与制作设计公司洛阳网站设计哪家专业
  • 湘潭网站建设 w磐石网络中国能源建设集团有限公司是央企
  • 网站建设中间件收费游戏网站建设的策划