2016级算法第五次上机-C.Bamboo和"Coco"
1064 Bamboo和"Coco"
分析题意
每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的)。主要考贪心思路,为了使得花瓣总量最少,每次比思念值更低的“邻近亡灵”的花瓣数多一就可以了
思路
都是先保证每个亡灵至少一个花瓣
思路一
直接模拟思路,同时关心左边和右边(或者说前边和后边),一次循环是不够的,比如3 2 1,修改了1号的花瓣数,再修改2号的花瓣数,此时会对一号产生影响。需要多次遍历,直到没有新的改变为止,算法为O(n^2),大的数据主要为卡掉这种暴力的思路
大致代码如下:
while (flag)
{
flag = false;
for (int i = 0; i < n; i++)
{
if (i != n - 1 && ratings[i] > ratings[i + 1] && candies[i] <= candies[i + 1])
{
candies[i] = candies[i + 1] + 1;
flag = true;
}
if (i > 0 && ratings[i] > ratings[i - 1] && candies[i] <= candies[i - 1])
{
candies[i] = candies[i - 1] + 1;
flag = true;
}
}
}
思路二
两遍循环,先从左到右考虑与左边的亡灵相比,再从右到左考虑与右边的亡灵相比,可以用两个数组也可以用一个数组
两个数组,left[]和right[]分别都初始化为1,各自只考虑左边和右边。
对于left:当前比左边思念值高时,left[i]=left[i-1]+1;
对于right:当前比右边思念值高时,right[i]=right[i+1]+1;
最后要同时满足左右两边的条件,所以ans[i]=max(left[i],right[i])
代码如下:
const int maxx = 1e6+5;
int Left[maxx],Right[maxx];
int thinking[maxx];
int main()
{
int n,x;
while(~scanf("%d",&n))
{
for(int i = 0;i<n;i++)
{
scanf("%d",&thinking[i]);
}
for(int i = 0;i<n;i++)
{
Left[i]=1;Right[i]=1;
}
for(int i= 1;i<n;i++)
{
if(thinking[i]>thinking[i-1])
Left[i]=Left[i-1]+1;
}
for(int i = n-2;i>=0;i--)
{
if(thinking[i]>thinking[i+1])
Right[i]=Right[i+1]+1;
}
int res = 0;
for(int i = 0;i<n;i++)
res += max(Left[i],Right[i]);
printf("%d\n",res);
}
}
也可以只用一个数组,第二遍从右到左时加点条件即可,节省空间
核心代码如下:
for(int i = 0; i<len-1; i++)
{
if(ratings[i+1]>ratings[i])
num[i+1]=num[i]+1;
}
for(int i = len-1; i>0; i--)
{
if(ratings[i-1]>ratings[i]&&num[i-1]<=num[i])
num[i-1]=num[i]+1;
}
for(int i =0; i<len; i++)res += num[i];
2016级算法第五次上机-C.Bamboo和"Coco"的更多相关文章
- 2016级算法第五次上机-B.Bamboo&APTX4844魔发药水
Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能 ...
- 2016级算法第五次上机-F.ModricWang的水系法术
1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...
- 2016级算法第五次上机-E.AlvinZH的学霸养成记IV
1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...
- 2016级算法第五次上机-A.Beihang Collegiate Pronunciation Contest 2017
1065 Beihang Collegiate Pronunciation Contest 2017 思路 在字符串中不断做匹配 找到一个匹配就输出 时间复杂度\(O(n)\) ps.模式串是定长的, ...
- 2016级算法第五次上机-G.ModricWang的撒币游戏
1062 ModricWang的撒币游戏 思路 此题为2017年ACM-ICPC亚洲区域赛乌鲁木齐赛区的A题,现场94个队中有38个队做出此题.在这里作为满分以外的题,是为了让大家看一下外面一些题的风 ...
- 2016级算法第五次上机-D.AlvinZH的学霸养成记III
850 AlvinZH的学霸养成记III 思路 难题.概率DP. 第一种思考方式:直接DP dp[i]:从已经有i个学霸到所有人变成学霸的期望. 那么答案为dp[1],需要从后往前逆推.对于某一天,有 ...
- 2016级算法第六次上机-E.Bamboo之吃我一拳
Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均 ...
- 2016级算法第六次上机-A.Bamboo之寻找小金刚
Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 ...
- 2016级算法第四次上机-E.Bamboo and the Ancient Spell
Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...
随机推荐
- 543. Diameter of Binary Tree 二叉树的最大直径
[抄题]: Given a binary tree, you need to compute the length of the diameter of the tree. The diameter ...
- spring4-3-AOP-面向切面编程
AOP常用的两个用户:日志和验证.也就是程序追踪和数据验证. 直接使用代码实现,距离如下:
- (转)Android SDK Manager国内无法更新的解决方案
转载地址:http://www.linuxidc.com/Linux/2015-01/111958.htm 现在由于GWF,google基本和咱们说咱见了,就给现在在做Android 或者想学习An ...
- ubuntu-server部署php+mysql运行环境
1.apt-get install git php5 mysql-server apache2 phpmyadmin 2.sudo ln -s /usr/share/phpmyadmin /var/w ...
- C#记录程序运行时间
主要:using System.Diagnostics;当中有Stopwatch类: 介绍如下: // 摘要: // 提供一组方法和属性,可用于准确地测量运行时间. public class Stop ...
- 我的BootStrap学习笔记
1.全局样式里面: 1.container:版心 2.col-xx-xx:栅格布局 3.btn btn-default: 按钮,默认按钮样式 4..pull-left pull-right cle ...
- Linux route命令 显示getnameinfo failed [UNKNOWN]
Redhat配置IPv6以后,执行route显示getnameinfo failed [UNKNOWN] 修改/etc/hosts,增加主机名后,重启服务器,问题解决
- DELPHI XE5/6/7 android 无线真机调试
一.下载adbWireless 地址:http://sj.zol.com.cn/detail/41/40834.shtml 安装,需要ROOT权限. 运adbWireless.界面很简单,就一个大按钮 ...
- MyBatis 一级缓存避坑
MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选: package org.apache.ibatis.session; /** * @autho ...
- /Date(1512551901709+0800)/转换
var convertDT=function(dt) { dt.replace(/Date\([\d+]+\)/, function (a) { eval('d = new ' + a) }); al ...