P3078 [USACO13MAR]扑克牌型Poker Hands
题目描述
Bessie and her friends are playing a unique version of poker involving a deck with N (1 <= N <= 100,000) different ranks, conveniently numbered 1..N (a normal deck has N = 13). In this game, there is only one type of hand the cows can play: one may choose a card labeled i and a card labeled j and play one card of every value from i to j. This type of hand is called a "straight".
Bessie's hand currently holds a_i cards of rank i (0 <= a_i <= 100000). Help her find the minimum number of hands she must play to get rid of all her cards.
一个牛有N堆牌,每堆排数量不等。一只牛一次可以将第i张到第j张各打一张出去,问最少几次打完
输入输出格式
输入格式:
* Line 1: The integer N.
* Lines 2..1+N: Line i+1 contains the value of a_i.
输出格式:
* Line 1: The minimum number of straights Bessie must play to get rid of all her cards.
输入输出样例
5
2
4
1
2
3
6
说明
Bessie can play a straight from 1 to 5, a straight from 1 to 2, a straight from 4 to 5, two straights from 2 to 2, and a straight from 5 to 5, for a total of 6 rounds necessary to get rid of all her cards.
Solution:
本题思路比较巧妙~。
我们可以先画图模拟一下,会发现每次连在一起的区间(不含$0$),肯定是同时去消除最优,即$ans$累加该区间最小值,整个区间减去这段的最小值),按照上述过程去模拟,求出的$ans$是一定正确的。因为我们尽可能的消除了每个连续区间的最小值,假设不消除整段区间,后面至少也会用相同的次数去消除这段区间,所以保证了后面不会有答案比此更优。(说的不够清白,可以画图模拟)。这样其实就可以用线段树维护了,但是可以更加简单。
我们仔细思考上面模拟的过程,会发现,每次让一个数被清$0$的同时去尽可能多的让其它数也有所减少,一定是最优的。那么每读入一个数,我们就让其和前一个数看是否能组成一个区间去整体消除。
也就是意味着开始时我们以第一次读入的数$a_1$作为区间最大值,然后$ans$至少需要累加$a_1$(很显然,消除一个数$a_1$至少要$a_1$次),当读入$a_2$时,若$a_2>a_1$那么要消除$a_2$至少还要$a_2-a_1$次,于是$ans$加上$a_2-a_1$,若$a_2\leq a_1$那么就不需要累加,因为在前面$a_1$的消除中就能同时消去$a_2$。由于要是一段连续的区间,所以每个新读入的值$a_i$只与前一个数$a_{i-1}$有关(再往前就不保证区间一定连续了),于是重复上面的步骤就$OK$了。
整体复杂度$O(n)$,实在是太巧妙了!~。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a,b,ans,n;
int main(){
scanf("%lld",&n);
while(n--){
scanf("%lld",&a);
if(a>b)ans+=(a-b);
b=a;
}
cout<<ans;
return ;
}
P3078 [USACO13MAR]扑克牌型Poker Hands的更多相关文章
- 洛谷 P3078 [USACO13MAR]扑克牌型Poker Hands
P3078 [USACO13MAR]扑克牌型Poker Hands 题目描述 Bessie and her friends are playing a unique version of poker ...
- 洛谷P3078 [USACO13MAR]扑克牌型Poker Hands
题目描述 Bessie and her friends are playing a unique version of poker involving a deck with \(N\) (\(1 \ ...
- 「Luogu P3078 [USACO13MAR]扑克牌型Poker Hands」
本题有\(O(N)\)的优秀做法,但是因为在考场上不一定能想到,就来分享一种\(O(N\log_2N)\)的做法.虽然有点慢,但是可以过. 前置芝士 线段树:提高组及以上必备内容,不会的同学可以学习一 ...
- 【贪心 思维题】[USACO13MAR]扑克牌型Poker Hands
看似区间数据结构的一道题 题目描述 Bessie and her friends are playing a unique version of poker involving a deck with ...
- 使用ML.NET实现德州扑克牌型分类器
导读:ML.NET系列文章 本文将基于ML.NET v0.2预览版,重点介绍提取特征的思路和方法,实现德州扑克牌型分类器. 先介绍一下德州扑克的基本牌型,一手完整的牌共有五张扑克,10种牌型分别是: ...
- P3078 [USACO13MAR]Poker Hands S
链接:Miku ---------------- 这道题和线段树有什么关系 --------------- 很简单的贪心,如果一堆牌比左边的大,那么肯定是要加上他的差的 反正,顺手出掉就可以了 --- ...
- USACO Poker Hands
洛谷 P3078 [USACO13MAR]扑克牌型Poker Hands 题目传送门 JDOJ 2359: USACO 2013 Mar Silver 1.Poker Hands JDOJ传送门 题目 ...
- JAVA collection集合之 扑克牌游戏
主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...
- 基于AForge.Net框架的扑克牌识别
原文:基于AForge.Net框架的扑克牌识别 © 版权所有 野比 2012 原文地址:点击查看 作者:Nazmi Altun Nazmi Altun著,野比 译 下载源代码 - 148.61 KB ...
随机推荐
- python剑指offer剪绳子
题目 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少 ...
- 在主机端和设备端进行”incrementArray“并对结果进行比较
实验思想: 在主机端将数据初始化后传输到设备端,设备端和主机端进行同样的操作对数据加1,然后将设备端的结果传输到主机,最后核对主机端的计算结果和设备端的计算结果是否一直. // incrementAr ...
- strong和weak
ios中使用ARC后,内存管理使用了新的关键字:strong(强引用) 和 weak(弱引用),默认是strong引用 strong: 使用strong类型指针指向的对象,会一直保持指向,直到所有st ...
- caller、callee的用法及区别
1 :caller 返回一个调用当前函数的引用 如果是由顶层调用的话 则返回null (举个栗子哈 caller给你打电话的人 谁给你打电话了 谁调用了你 很显然是下面a函数的执行 只有在打电话的时 ...
- cf550C. Divisibility by Eight(结论)
题意 给出长度为$n$的字符串,判断是否能删除一些数后被$8$整除 Sol 神仙题啊Orz 结论: 若数字的后三位能被$8$整除,则该数字能被$8$整除 证明 设$x = 10000 * a_i + ...
- JS - Array.slice 与 Array.splice
1)Array.slice方法 1.1)接收两个参数: a:起始下标 b:结束下标 1.2)返回由a(包括)至b(不包括)的元素所组成的数组 ...
- [mysql] Can't read from messagefile
系统:windows 重启mysql服务出现 Server] Can't read from messagefile 等错误时候, 应先执行 mysqld --initialize-insecure ...
- JavaScript之map与parseInt的陷阱
问题来源 这个问题的来源是学习廖雪峰老师JS教程.问题如下:小明希望利用map()把字符串变成整数,他写的代码很简洁: 'use strict'; var arr = ['1', '2', '3' ...
- 如何在 Linux 中配置基于密钥认证的 SSH
什么是基于 SSH 密钥的认证? 众所周知,Secure Shell,又称 SSH,是允许你通过无安全网络(例如 Internet)和远程系统之间安全访问/通信的加密网络协议.无论何时使用 SSH 在 ...
- HTML5/CSS3 第一章基础
HTML5/CSS3基础 1. HTML 1.1 什么是HTML HTML是用来制作网页的标记语言 HTML是Hypertext Markup Language的英文缩写,即超文本标记语言 HTML语 ...