中学信息奥赛

STL(一)课堂练习

1.1顺序表的删除(vector,list)

题目描述

对一个线性表进行删除操作。

输入格式

输入存在多组数据,以 EOF 结束。数据组数不超过 1010 组。

第一行有一个整数 n (1≤n≤9000)n (1≤n≤9000),表示线性表的大小;

第二行有 nn 个整数,分别是 list1,list2,⋯,listnlist1​,list2​,⋯,listn​。

第三行有一个整数 qq,表示 qq 次删除操作,接下来 qq 行,每行有一个整数 kk,表示删除线性表中第 kk 个元素。

输出格式

对于每次删除操作输出一行,如果 k不合法,输出 −1, 否则输出删除的元素。

样例输入 

5
3 2 1 5 4
3
5
5
2

样例输出

4
-1
2

源代码

#include<bits/stdc++.h>
using namespace std;
int main(){
 int n,q,k;
 vector<int> a;
 vector<int>::iterator it;
 while (cin>>n){
     a.clear();
     for(int i=0;i<n;i++){
         int t;
        cin>>t;
        a.push_back(t); 
     }
cin>>q;
for(int i=0;i<q;i++) {
    cin>>k;
    if(k<=a.size()){
        it=a.begin();
        cout<< *(it+k-1)<<"\n";
        a.erase(it+k-1);
    }
    else{
        cout<<"-1\n";
    }
}
}
return 0;
 }


1.2{A} + {B}(set)

题目描述

给你两个可重集合,要求{A} + {B}.
注:同一个可重集合中可能有两个相同的元素.

输入格式

每组输入数据分为三行,第一行有两个数字n,m(0 < n,m <=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.

输出格式

针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.

样例输入 #1

1 2
1
2 3
1 2
1
1 2

样例输出 #1

1 2 3
1 2

源代码

#include<bits/stdc++.h>
using namespace std;
set<int> s;
int main(){
    int n,m;
    while(cin>>n>>m){
        s.clear();
        for(int i=0;i<n+m;i++){
            int d;
            cin>>d;
            s.insert(d);
        }    
        set<int>::iterator it;
        for(it=s.begin();it!=s.end();it++){
            cout<<*it<<" "; 
        }
        
        cout<<"\n";
            
    }
    return 0;
    
}

1.3统计数字(map)

题目描述

某次科研调查时得到了 nn 个自然数。已知不相同的数不超过 1000010000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

输入格式

第一行包含一个整数 nn (n≤200000)(n≤200000),表示自然数的个数。

接下来 nn 行,每行包含一个自然数,每个自然数均不超过 1.5×1091.5×109.

输出格式

输出 mm 行(mm 为 nn 个自然数中不同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是该自然数及其出现的次数,其间用一空格隔开。

样例输入 #1

8
2
4
2
4
5
100
2
100

样例输出 #1

2 3
4 2
5 1
100 2

源代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    map<int,int>mp;
    map<int,int>::iterator it;
    int n,d;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>d;
        mp[d]++;
    }    
    for(it=mp.begin();it!=mp.end();it++)
        cout<<it->first<<" "<<it->second<<endl;
        return 0;
}

1.4ACboy 再次需要你的帮助(stack,queue)

题目描述

对于每一个样例,第一行是N和一个字符串”FIFO”或者”FILO”(FIFO表示先进先出,即队列;FILO表示先进后出,即栈,),N表示命令的个数,下面有N行,每一行表示一个命令。命令分为两种,IN a 表示进去一个a,OUT表示出一个队头元素或者栈顶元素。

输入格式

第一行是一个数字T,表示样例的个数,对于每一个样例,如题目所述。

输出格式

对于每一个OUT命令,你要根据”FIFO”和”FILO”单独一行输出一个数字,或者输出None如果没有整数了。

样例输入 #1

复制

4 
4 FIFO 
IN 1 
IN 2 
OUT 
OUT 
4 FILO 
IN 1 
IN 2 
OUT 
OUT 
5 FIFO 
IN 1 
IN 2 
OUT 
OUT 
OUT 
5 
FILO 
IN 
1 
IN 2 
OUT 
IN 3 
OUT

样例输出 #1

复制

1 
2 
2 
1 
1 
2 
None 
2 
3

源代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	stack<int> st;
	queue<int> dp;
	char l[5];
	char s[5];
	int N,tmp;
	cin>>N;
	for(int i=0;i<N;i++)
	{
		int t;
		cin>>t>>l;
		if(l[2]=='F'){
			for(int i=0;i<t;i++) 
			{
				cin>>s;
				if(s[0]=='I')//注意这里是单引号 
				{
				cin>>tmp;
				dp.push(tmp);
				}
				else
				{
					if(dp.empty())
					cout<<"None\n";
					else 
					{
					cout<<dp.front()<<"\n";
					dp.pop();
				}
			}
	
		}
			while (!dp.empty()){
				dp.pop();//这里是清空队列 
			}
		}
				
		else{
		    for(int i=0;i<t;i++) 
			{
				cin>>s;
				if(s[0]=='I')//注意这里是单引号 
				{
				cin>>tmp;
				st.push(tmp);
				}
				else 
				{
					if(st.empty())
					cout<<"None\n";
					else 
					{
					cout<<st.top()<<"\n";
					st.pop();
				}
			}
			
		}
	while (!st.empty()){
				st.pop();//这里是清空队列 
			}
		
	}
}
}


1.5栈的操作

题目描述

栈是一种线性数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
对输入整数序列1 2 3 ..执行一组栈操作,输出操作的出栈序列。

输入格式

每行是一个测试用例,表示一个操作序列。操作序列由P和Q两个符号组成,P表示入栈,Q表示出栈。每个操作序列长度不超过1000。

输出格式

对每个操作序列,输出出栈序列,若操作序列有错误,如栈空时执行出栈操作,输出error,并结束当前操作序列的执行。 出栈序列之间用一个空格隔开,末尾没有多余的空格!

样例输入 #1

PQPPQQPPPQPQ
PPPPQQP
PP
PQQPP
PPQQ

样例输出 #1

1 3 2 6 7
4 3

1 error
2 1

源代码

#include <bits/stdc++.h>
using namespace std;
stack<int> st;
queue<int> dq;

int main(){
    int n,m,tmp;
    string s,ss;
    cin>>n;
    cin.ignore(); 
    while(n--){
        cin>>m>>s;
        cin.ignore(); 
        if(s == "FIFO"){               
            for(int i=0;i<m;i++){
                cin>>ss;    
                if(ss == "IN"){
                    cin>>tmp;
                    dq.push(tmp);
                }
                else if(ss == "OUT"){
                    if(dq.empty()){
                        cout<<"None\n";
                    }
                    else{
                        cout<<dq.front()<<endl;
                        dq.pop();
                    }
                }
            }
            while(!dq.empty()){
                dq.pop();
            }
        }    
        else if(s == "FILO"){            //Υ» 
            for(int i=0;i<m;i++){
                cin>>ss;    
                if(ss == "IN"){
                    cin>>tmp;
                    st.push(tmp);
                }
                else if(ss == "OUT"){
                    if(st.empty()){
                        cout<<"None\n";
                    }
                    else{
                        cout<<st.top()<<endl;
                        st.pop();
                    }
                }
            }
            while(!st.empty()){
                st.pop();
            }
        }
    }
    return 0;
}

1.6购物(map)

题目描述

大街上总共有 nn 家商店,而 Dandelion 特别喜欢一家叫 memory 的商店。

由于春节快到了,所有商店的价格每天都在上涨。

Dandelion 想知道 memory 这家商店每天的价格排在第几位。

输入格式

第一行包含一个整数 n (n≤10000)n (n≤10000),代表商店数量。

其后 nn 行,每行包含一个字符串(长度小于 3131,且只包含小写字母和大写字母),表示商店名称。

其后一行包含一个整数 m (1≤m≤50)m (1≤m≤50),表示天数。

其后有 mm 部分,每部分有 nn 行,每行包含一个整数 p (0≤p≤50)p (0≤p≤50) 和一个字符串 ss,表示商店 ss 在这一天涨价 pp。

输出格式

输出 mm 行,第 ii 行输出第 ii 天后店铺 memory 的排名。

排名的定义:如果有 tt 个商店的价格高于 memory,那么它的排名就是 t+1t+1。

样例输入 

3
memory
kfc
wind
2
49 memory
49 kfc
48 wind
80 kfc
85 wind
83 memory

样例输出 

1
2

源代码

#include <bits/stdc++.h>
using namespace std;

map<string, int> a;
map<string, int>::iterator it;


int main(){
    int i,j,n,m;
    cin>>n;
    i = n;
    while(i--){
        string s;
        cin>>s;
        a[s] = 0;
    }
    cin>>m;
    i = m;
    while(i--){
        int p=1;
        j = n;
        while(j--){
            int num;
            string s;
            cin>>num>>s;
            a[s] += num;
        }
        it = a.begin();
        while(it!=a.end()){
            if(it->second > a["memory"])p++;
            it++;
        }
        cout<<p<<endl;
    }
    return 0;
} 

再编:

1.对于多组样例,或者逻辑上要使用不同的数据结构(已经定义过的),需要在每组操作之后进行清空。其中set使用s.clear();栈和队列使用pop()操作直至为空.

题目中只使用一种容器可以在主函数开头进行清空,使用两种可以在每组操作后完成

2.其中输出栈顶元素是a.top;队头元素为a.front;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值