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. Python采集CSDN博客排行榜数据

    文章目录 前言 网络爬虫 搜索引擎 爬虫应用 谨防违法 爬虫实战 网页分析 编写代码 运行效果 反爬技术 前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知 ...

  2. Python 编程开发 实用经验和技巧

    文章目录 一.小数保留指定位小数 1.%f 方法 2.format函数 3.round()函数 4.直接截断 二.判断变量的数据类型的两种方法 1.type(): 2.isinstance() 三.p ...

  3. qdu-凑数题(01背包)

    Description 小Q手里有n(n<=1000) 个硬币,每枚硬币有一定的金额(200=>x>=1)他想知道,用这些硬币(每枚硬币只能用一次,但可能会有等面值的用两次) 能组成 ...

  4. 会话技术之 Session

    会话技术之 Session 不多废话,先来一个 HelloWorld. Session 有 get 肯定要先有 set . @Override protected void service(HttpS ...

  5. 当this碰到return会发生什么

    当this碰到return时 function fn(params) { this.user = 'fzy' return {} } var a = new fn console.log(a.user ...

  6. ORA-00119: ORA-00132: 解决办法 -九五小庞

    问题描述: 1. em打开中提示 https://localhost:1158/em/console/database/instance/repDown?target=orclweng&typ ...

  7. leetcode刷题-49字母异位词分组

    题目 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 思路 由于异位词由相同字母构成,所以可以用一个顺序的字符串作为这些字母异位词的标志,由此可以想到字典的方法 ...

  8. Ubuntu修改默认Python版本,你了解多少~

    目录 1 查看Python版本 1.1 查看装有哪些版本 1.2 查看默认版本 2 修改Python默认版本 2.1 基于文件修改 2.2 基于软链接修改 1 查看Python版本 1.1 查看装有哪 ...

  9. HTML -- 表单元素2

    (1)<select>元素(下拉列表) <html> <body> <!-- 表单处理程序在action属性中指定 --> <form actio ...

  10. css常用属性之绝对定位、相对定位、滚动条属性、背景图属性、字体、鼠标、超链接跳转页面

    1.绝对定位position: fixed(比如广告页面向下滑动的时候,页面最上方有个标题不能随之滑动,就需要用到position: fixed,同时还需要用到一个标签(标签高度很高才会出现滚动的情况 ...