当前位置:网站首页>Draw Your Cards
Draw Your Cards
2022-07-31 02:03:00 【山中一扶苏】
原题链接
题目描述
现有n张牌叠在一起,每次从最上面取出一张牌(上面的值为x),面朝上放在桌上,放置规则为:
找到已经在桌上的牌中第一个>=x的,叠在上面(更新该处的值)
若每日找到符合要求的,则新开一堆(单张牌放着)
如果某一堆摊开的牌个数达到了k,就可以把这一堆拿走
按照牌序号1-n的顺序输出该牌是什么时候被拿走的,没被拿走的牌则输出-1
输入样例
5 2
3 5 2 1 4
输出样例
4
3
3
-1
4
算法
(链式存储 + 二分查找)
模拟。set 维护每一堆牌的数量以及顶部的那张牌的值
二分查找值来实现更新
有一个不太好处理的点,就是在拿走k张牌的时候,如何找到路径呢?
那么可以用一个数组来迭代保存路径(有点像链表一样,往回找)
然后因为取牌是有顺序的,所以可以在线处理
注意:要用set自带的lower_bound,效率比 < algorithm > 头文件带的lower_bound 会高很多很多
C++ 代码
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
typedef pair<int,int> PII;
int main()
{
int n,k;
scanf("%d%d",&n,&k);
vector<int> card(n + 10,-1),cnt(n + 10,0),store(n + 10,-1);
set<int> s;
for (int i = 1;i <= n;i ++ ) {
int p;
scanf("%d",&p);
auto key = s.upper_bound(p);//一定要用set自带的upper_bound
if (key == s.end()) {//end是最后一个的下一个
s.insert(p);
cnt[p] = 1;
}else {//只存最上面的值,且利用指针存下面的值
store[p] = (*key);
cnt[p] = cnt[(*key)] + 1;
s.erase(key);
s.insert(p);
}
if (cnt[p] == k) {
s.erase(p);
int x = p;
for(int j = 0;j < k;j ++){
card[x] = i;
x = store[x];//不断迭代下面的存储的值
}
}
}
for (int i = 1;i <= n;i ++ ) printf("%d\n",card[i]);
return 0;
}
边栏推荐
- [1153]mysql中between的边界范围
- C language applet -- common classic practice questions
- 16. Registration Center-consul
- 两个有序数组间相加和的Topk问题
- coldfusion8 background scheduled tasks take shell
- Can an inexperienced college graduate switch to software testing?my real case
- The comprehensive result of the case statement, do you know it?[Verilog Advanced Tutorial]
- Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
- CV-Model [3]: MobileNet v2
- Crawler text data cleaning
猜你喜欢
随机推荐
[1154]如何将字符串转换为datetime
PDF 拆分/合并
《云原生的本手、妙手和俗手》——2022全国新高考I卷作文
Real-time image acquisition based on FPGA
Unity界面总体介绍
什么是理想的大学生活?
C language applet -- common classic practice questions
Static route analysis (the longest mask matching principle + active and standby routes)
Inter-vlan routing + static routing + NAT (PAT + static NAT) comprehensive experiment
Project development software directory structure specification
基于FPGA的售货机
程序员转正述职报告/总结
uniapp使用第三方字体
汉诺塔问题
mysql index
leetcode-952:按公因数计算最大组件大小
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
Crypto Life, a day in the life of a Web3 project partner
The final exam first year course
ShardingJDBC使用总结









