基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题
 收藏
 取消关注
又到了诺德县的百姓孝敬夹克大老爷的日子,带着数量不等的铜板的村民准时聚集到了村口。

夹克老爷是一位很"善良"的老爷,为了体现他的仁慈,有一套特别的收钱的技巧。

1、让所有的村民排成一队,然后首尾相接排成一个圈。

2、选择一位村民收下他的铜钱,然后放过他左右两边的村民。

3、让上述三位村民离开队伍,并让左右两边的其他村民合拢起来继续围成一个圈。

4、重复执行2、3直到村民全部离开。

夹克老爷的家丁早早的组织村民排成一队并清点了村民人数和他们手里的铜钱数量。

作为夹克老爷的首席师爷,你要负责按照夹克老爷的收钱技巧完成纳贡的任务。

聪明的你当然知道夹克老爷并不像他表现出来的那样仁慈,能否收到最多的钱财决定了你是否能够继续坐稳首席师爷的位置。

今年村民的人数是N,恰巧是3的倍数。





提示:第2步选择村民时不需要按照任何顺序,你可以选择任何一位仍然在队伍里的村民收取他手中的钱财并放走他两侧的村民(这就意味着你无法同时收取到这两位的铜钱了)
Input
第一行1个整数N(3 <= N <= 10^5 - 1, N % 3 == 0)
第2 - N + 1行:每行1个数对应村民i手中的铜钱。(0 <= m[i] <= 10^9)
Output
一个整数,说明在夹克老爷的收钱规则下你最多能够为夹克老爷搜刮到多少铜钱
Input示例
6
6
2
3
4
5
9
Output示例
13

问题等价于N长的数组中抽取N/3个不相邻的值使得和最大(首尾也不能同时取)

普通的dp方法复杂度n^2会TLE
用贪心,类似最大M子段和的方式
初始全部数字可选状态,进优先队列,弹出最大值,结果中加上选中的最大值,删除最大值左右两边的值,将最大值位置的值修改为左右两边的和减去中间的数重新进入优先队列,循环处理直到拿到要求的数据个数。

以上是官方题解。。。头一次用优先队列做这种题,“结果中加上选中的最大值,删除最大值左右两边的值,将最大值位置的值修改为左右两边的和减去中间的数重新进入优先队列,循环处理直到拿到要求的数据个数。”这块太巧妙了,直接把算法的时间复杂度搞到了O(n)。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#pragma warning(disable:4996)
using namespace std; #define impossible -1*(1e9+7) struct no
{
long long val;
int pos; friend bool operator<(no n1, no n2)
{
return n1.val < n2.val;
}
}node[100005]; int n;
long long val[100005]; int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout); int i, k, temp, out;
unsigned long long sum;
no n_temp;
priority_queue<no>q; scanf("%d", &n); for (i = 0; i < n; i++)
{
scanf("%d", &temp);
node[i].val = temp;
node[i].pos = i;
q.push(node[i]); val[i] = temp;
} k = 0;
sum = 0;
out = n / 3;
while (true)
{
n_temp = q.top();
if (n_temp.val <= 0)
break;
if (val[n_temp.pos] != impossible)
{
q.pop();
sum += n_temp.val; int le = n_temp.pos;
int ri = n_temp.pos;
while (val[(le - 1 + n) % n] == impossible)
{
le--;
}
while (val[(ri + 1 + n) % n] == impossible)
{
ri++;
} no nn_temp;
nn_temp.val = val[(le - 1 + n) % n] + val[(ri + 1 + n) % n ] - n_temp.val;
nn_temp.pos = n_temp.pos; q.push(nn_temp); val[n_temp.pos] = nn_temp.val;
val[(le - 1 + n) % n] = impossible;
val[(ri + 1 + n) % n] = impossible; k++;
}
else
{
q.pop();
}
if (k == out)
break;
} printf("%lld\n", sum);
//system("pause");
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

51nod 1380:夹克老爷的逢三抽一的更多相关文章

  1. 51nod 1380"夹克老爷的逢三抽一"(贪心+set)

    传送门 •参考资料 [1]:51Nod-1380-夹克老爷的逢三抽一 •题意 从长度为 n 的数组中抽取 $\frac{n}{3}$ 个不相邻的值使得加和最大(首尾也不能同时取) •题解 贪心选择当前 ...

  2. 51Nod 1380 夹克老爷的逢三抽一

    Description 一开始有一个环,可以选择删除一个元素获得他的权值,同时删除与它相邻的两个元素,其他元素重新形成环,问能获得的最大价值. Sol 堆+贪心. 一开始从堆中加入所有元素,然后取出一 ...

  3. 51nod1380 夹克老爷的逢三抽一

    问题等价于选出$n / 3$个不相邻元素是权值和最大 这是一个经典贪心问题,同种树,拿堆维护即可,复杂度$O(n \log n)$ #include <queue> #include &l ...

  4. 51nod 1378 夹克老爷的愤怒(树型dp+贪心)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1378 题意: 思路:要想放得少,尽量放在叶子节点处,叶子节点处点比较多. ...

  5. 51Nod 1378 夹克老爷的愤怒

    Description 一棵树,可以进行染色,被染色的点可以控制与它距离不超过 \(k\) 的所有点,问控制整棵树最少需要染几个点. Sol 贪心. 记录一下最深的未染色点和最浅的染色点,判断一下能否 ...

  6. 51nod 1378:夹克老爷的愤怒 很好玩的一道树状dp

    1378 夹克老爷的愤怒 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 夹克老爷逢三抽一之后,由于采用了新师爷的策略,乡民们叫苦不堪,开始组织 ...

  7. 逢三退一(boolean数组的使用)

    package com.hanqi.count; // 逢三退一 输出留到最后值的索引; public class Count1 { //主方法 public static void main(Str ...

  8. 51nod 1625 夹克爷发红包

    题目链接戳这里 题意是有一个赋有非负数的矩阵,每次可以将某一行or某一列替换成某个数值,可以替换<=k次,问如何替换能使得矩阵总和最大,输出最大值. 一开始想的是简单的贪心:比如找当前收益最大的 ...

  9. 胡小兔的OI日志3 完结版

    胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...

随机推荐

  1. Flask - flask-mail

    flasky中git reset --hard 8e 问题 使用flask-mail通过163邮箱的smtp服务发送token认证邮件,要关闭TLS才能发送 原理 还在研究中 结果

  2. PTA的Python练习题(一)

    最近宅家里没事干,顺便把python给学了.教程和书看了一段时间,但是缺少练习的平台. 想起大一时候练习C语言的PTA平台,就拿来练手了. (因为没有验证码无法提交题目,所以自己用pycharm来做题 ...

  3. Activiti工作流学习笔记一

    Activiti工作流 一:Activiti第一天 1:工作流的概念 说明: 假设:这两张图就是华谊兄弟的请假流程图 图的组成部分: 人物:范冰冰冯小刚王中军 事件(动作):请假.批准.不批准 工作流 ...

  4. 学习不一样的Vue1:环境搭建

    学习不一样的Vue1:环境搭建  发表于 2017-05-31 |  分类于 web前端|  |  阅读次数 11677 首先 首发博客: 我的博客 项目源码: 源码 项目预览: 预览 因为个人的喜好 ...

  5. c语言中“#if 0 / #if 1 ... #endif”的作用

    原帖地址:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=2028608&bbs_page_no=1005&bbs_id=9999 1. ...

  6. Shell Sort(希尔排序)

    这个排序算法很厉害,我个人很喜欢这个算法,但算法的时间复杂度难计.算法对增量(这里也称作step(步长))的选择也需要注意,只记得个希尔增量的最坏情况为O(n^2).Hibbard增量的最坏情况为O( ...

  7. WebMagic基础与Maven管理依赖

    2. 快速开始 WebMagic主要包含两个jar包:webmagic-core-{version}.jar和webmagic-extension-{version}.jar.在项目中添加这两个包的依 ...

  8. 使用HttpURLConnection通过post请求服务器时,URLEncode编码的必要性

    通过Post提交表单数据时,数据类型为x-www-urlencoded,提交到服务器的数据服务器默认是通过URLEncoder.encode()编码过得,所以服务器处理时会用URLDecoder.de ...

  9. webpack中devtool的配置方案[开发模式]---[线上模式]

    // 开发模式下 module.exports = { mode: 'development', devtool: 'cheap-module-eval-source-map' } // 线上模式下 ...

  10. Day11 - I - 取石子游戏 HDU - 2516

    1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出&q ...