博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Candy】cpp
阅读量:6042 次
发布时间:2019-06-20

本文共 2288 字,大约阅读时间需要 7 分钟。

题目

There are N children standing in a line. Each child is assigned a rating value. 

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

代码

class Solution {public:    int candy(vector
& ratings) { const size_t len = ratings.size(); std::vector
candyNum(len); // from left to right for (size_t i = 1; i < len; ++i){ if (ratings[i] > ratings[i-1]) candyNum[i] = candyNum[i-1] + 1; } // from right to left for (size_t i = 1; i < len; ++i){ if (ratings[len-i-1]>ratings[len-i]){ candyNum[len-i-1] = std::max(candyNum[len-i]+1,candyNum[len-i-1]); } } return std::accumulate(candyNum.begin(), candyNum.end(), len); }};

Tips:

大体思路是greedy。题目的需求可以分解为如下两个条件:

a. ratings从左向右的子递增序列,candy也要是递增的

b. ratings从右向左的子递增序列,candy同样也是递增的

具体:

1. 从左往右遍历一次,保证从左→右的递增序列,candy都是递增1的(相当于先对条件a进行了一次greedy,保证了条件a是充分的)

2. 从右往左遍历一次,保证从右→左的递增序列,candy也是至少递增1的(相当于再对条件b进行了一次greedy,保证了条件b是充分的,但是不能破坏条件a成立)

代码中一条关键语句如下:

std::max(candyNum[len-i]+1,candyNum[len-i-1]);

举个例子,ratings = {4,2,3,4,1}

从左往右走完第一遍 则candyNum = {0,0,1,2,0}

现在开始从右往左走,如果没有max这条语句,则走完右数第二个元素就变成了 candyNum = {0,0,1,1,0}

这样为了满足条件b就破坏了条件a,所以max这条语句是必要的。

从总体思路上来说:两个greedy并不能直接得到全局的最优解,需要调节两个greedy之间的矛盾,而max这条语句就是调节矛盾的

================================================

第二次过这道题,大体思路记得比较清楚,就是红字的部分,两个greedy之间不能破坏彼此的条件。

class Solution {public:    int candy(vector
& ratings) { vector
candys(ratings.size(),1); // from left to right for ( int i=1; i
ratings[i-1] ) candys[i] = candys[i-1]+1; } // from right to left for ( int i=ratings.size()-1; i>0; --i ) { if ( ratings[i-1]>ratings[i] ) { candys[i-1] = std::max( candys[i-1], candys[i]+1 ); } } return accumulate(candys.begin(), candys.end(), 0); }};

 

转载于:https://www.cnblogs.com/xbf9xbf/p/4459460.html

你可能感兴趣的文章
一周小程序学习 第1天
查看>>
小孩的linux
查看>>
SpringMVC、MyBatis声明式事务管理
查看>>
开发者详解:端游及手游服务端的常用架构
查看>>
JavaScript History对象
查看>>
在 Windows 下安装 Oracle 11g XE (Express Edition)
查看>>
ListView优化
查看>>
【原创】 PostgreSQL 实现MySQL 的auto_increment 字段
查看>>
vs2015添加vc助手
查看>>
检测点1.1
查看>>
android--------阿里 AndFix 热修复
查看>>
control.add()
查看>>
Sublime text3中配置Github
查看>>
Asp.net,C# 加密解密字符串
查看>>
网页视频播放器插件源码
查看>>
2019-4-23 plan
查看>>
[编解码] 关于base64编码的原理及实现
查看>>
WinDbg配置和使用基础
查看>>
转:Object-Runtime的基本数据类型
查看>>
JMJS系统总结系列----Jquery分页扩展库(五)
查看>>