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;

1406

被折叠的 条评论
为什么被折叠?



