STL容器的应用(一)

  1. 题目一:

1、给你一个1->n的排列和一个栈,入栈顺序给定
你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列
输入描述:
第一行一个数n
第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格
输出描述:
输出一行n个数表示答案,用空格隔开,结尾无空格
示例1
输入
5
2 1 5 3 4
输出
5 4 3 1 2
说明
2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈

代码一及相关注释:

#include<stdio.h>
#include<stack>//栈容器,用来记录入栈出栈的数
#include<queue>//优先队列容器,其默认由大到小出队列
using namespace std;
const int maxmun=1e6+7;
stack<int> s;
priority_queue<int> q;
int a[maxmun];
int main()
{
	
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		//TODO
		scanf("%d",&a[i]);
		q.push(a[i]);
		
	}
	for(int i=0;i<n;i++){
		//TODO
		s.push(a[i]);
		while(!s.empty()&&s.top()>=q.top()){
				//TODO
		printf("%d ",s.top());
		q.pop();
		s.pop();
		}
	}
	while(!s.empty()){
		//TODO
		printf("%d ",s.top());
		s.pop();
	}
	return 0;	
}

  1. 题目二

指纹锁
HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁。
该指纹锁的加密算法会把一个指纹转化为一个不超过1e7的数字,两个指纹数值之差越小,就说明两个指纹越相似,当两个指纹的数值差≤k时,这两个指纹的持有者会被系统判定为同一个人。
现在有3种操作,共m个,
操作1:add x,表示为指纹锁录入一个指纹,该指纹对应的数字为x,如果系统内有一个与x相差≤k的指纹,则系统会忽略这次添加操作
操作2:del x,表示删除指纹锁中的指纹x,若指纹锁中多个与x相差≤k的指纹,则全部删除,若指纹锁中没有指纹x,则可以忽略该操作,
操作3:query x,表示有一个持有指纹x的人试图打开指纹锁,你需要设计一个判断程序,返回该人是否可以打开指纹锁(只要x与存入的任何一个指纹相差≤k即可打开锁)。
初始状态,指纹锁中没有任何指纹。
输入描述:
第一行有2个正整数m,k。
接下来m行,每行描述一种操作:add x,del x或query x。
输出描述:
对于每个query操作,输出一行,包含一个单词“Yes”或“No”,表示该人是否可以打开指纹锁。
备注:
对于100%的测试数据:
1 ≤ k,m ≤ 1000000
数据量较大,注意使用更快的输入输出方式。
示例1
输入
4 3
add 1
add 10
query 5
query 4
输出
No
Yes
示例2
输入
4 3
add 1
query 4
del 1
query 4
输出
Yes
No
示例3
输入
6 3
add 10
query 10
add 5
query 5
del 7 //系统将指纹10和指纹5全部删除
query 8
输出
Yes
Yes
No

代码二及相关注释:

#include<stdio.h>
#include<set>
#include<math.h>
using namespace std;
set<int> e;
set<int>::iterator it,t;
int m,k;
int main(){
	scanf("%d %d",&m,&k);
	char str[10];
	int x;
	for(int i=1;i<=m;i++){
		//TODO
		scanf("%s %d",str,&x);
		if(str[0]=='a'){
			//TODO
			it=e.lower_bound(x-k);//利用lower_bound查找第一个大于或等于x-k的数的下标(由于set为由小到大排序,所以第一个即为最接近的一个)
			if(it==e.end()||*it>x+k)
			{
				e.insert(x);
			}
		}
		else if(str[0]=='d'){
			//TODO
			it=e.lower_bound(x-k);
			t=it;//指向it一开始指向的位置
			while(it!=e.end()&&*it<=x+k){
				//若存在符合条件的数,则,it向后移动,直至t-it概括所有符合条件的数
				it++;
			}
			e.erase(t,it);//使用erase函数批量删除t-it区间的数
		}
		else if(str[0]=='q'){
			//
			it=e.lower_bound(x-k);
			if(it!=e.end()&&*it<=x+k){
				//TODO
				printf("Yes\n");
			}
			else printf("No\n");
			
		}
		else
		{
			printf("请输入正确的指令!");
		}
	}
	return 0;
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值