pta 实验九 类库和标准库 C++

编程题

7-1 对称排序

分数 14

全屏浏览

作者 李廷元

单位 中国民用航空飞行学院

你供职于由一群丑星作为台柱子的信天翁马戏团。你刚完成了一个程序编写,它按明星们姓名字符串的长度非降序(即当前姓名的长度至少与前一个姓名长度一样)顺序输出他们的名单。然而,你的老板不喜欢这种输出格式,提议输出的首、尾名字长度较短,而中间部分长度稍长,显得有对称性。老板说的具体办法是对已按长度排好序的名单逐对处理,将前者放于当前序列的首部,后者放在尾部。如输入样例中的第一个案例,Bo和Pat是首对名字,Jean和Kevin是第二对,余此类推。

输入格式:

输入包含若干个测试案例。每个案例的第一行含一个整数n(n>=1),表示名字串个数。接下来n行每行为一个名字串,这些串是按长度排列的。名字串中不包含空格,每个串至少包含一个字符。n=0为输入结束的标志。

输出格式:

对每一个测试案例,先输出一行“Set n”,其中n从1开始取值,表示案例序号。接着是n行名字输出,如输出样例所示。

输入样例:

7
Bo
Pat
Jean
Kevin
Claude
William
Marybeth
6
Jim
Ben
Zoe
Joey
Frederick
Annabelle
5
John
Bill
Fran
Stan
Cece
0

输出样例:

SET 1
Bo
Jean
Claude
Marybeth
William
Kevin
Pat
SET 2
Jim
Zoe
Frederick
Annabelle
Joey
Ben
SET 3
John
Fran
Cece
Stan
Bill

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
int main()
{
 int size;
 int i,j=1;
 cin>>size;
while(size){
    cout<<"SET "<<j++<<endl;
    string s;
    vector<string> v;
    for(i=0;i<size;i++)
    {
        cin>>s;
        v.push_back(s);
    }
    for(i=0;i<size;i=i+2)
        cout<<v[i]<<endl;
    if(size%2==0)  i=size-1;
    else i=size-2;
    for(;i>0;i=i-2)
        cout<<v[i]<<endl;
    cin>>size;
    }
    return 0;
}

7-2 h0100. 字符串连接

作者 黄正鹏

单位 贵州工程应用技术学院

一种语言是一个字符串组成的集合。两种语言的拼接是在第一种语言的字符串的结尾处拼接第二种语言的字符串而构成的所有字符串的集合。

• 例如,如果给出两种语言 A 和 B :

• A = {cat, dog, mouse} ;

• B = {rat, bat} ;

• 则 A 和 B 的连接是:

• C = {catrat, catbat, dograt, dogbat, mouserat, mousebat} 。

• 给出两种语言,请您计算两种语言拼接所产生的字符串的数目。

输入格式:

输入有多个测试用例。输入的第一行给出测试用例的数目 T ( 1≤T≤25 )。接下来给出 T 个测试用例。每个测试用例的第一行给出两个整数, M 和N ( M, N < 1500 ),是每种语言中字符串的数量。然后, M 行给出第一种语言的字符串;接下来的 N 行给出了第二种语言的字符串。本题设定字符串仅由小写字母( 'a' 到 'z' )组成,长度小于 10 个字符,并且每个字符串在一行中给出,没有任何前导或尾随的空格。
输入语言中的字符串可能不会被排序,并且不会有重复的字符串。

输出格式:

对于每个测试用例,输出一行。每个测试用例的输出是以测试用例的序列号开始,然后给出在第一种语言的字符串之后拼接第二种语言中的字符串所产生的字符串数。

输入样例:

2
3 2
cat
dog
mouse
rat
bat
1 1
abc
cab

输出样例:

Case 1: 6
Case 2: 1

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
    int T;
    cin>>T;
    int M,N;
    vector<string> v;
    string s;
    for(int i=0;i<T;i++)
    {
        cin>>M>>N;
        for(int j=0;j<M+N;j++){
            cin>>s;
            v.push_back(s);
        }
        cout<<"Case "<<i+1<<": "<<M*N<<endl;
    }
    return 0;
}

7-3 笨小猴

作者 CCF-NOI

单位 成都信息工程大学

笨小猴的词汇量很少,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设max是单词中出现次数最多的字母的出现次数,min是单词中出现次数最少的字母的出现次数,如果max-min是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。

输入格式:

一个单词,其中只可能出现小写字母,并且长度小于100。

输出格式:

共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出No Answer

第二行是一个整数,如果输入单词是Lucky Word,输出max-min的值,否则输出0。

输入样例1:

error

输出样例1:

Lucky Word
2

输入样例2:

olympic

输出样例2:

No Answer
0

#include<iostream>
#include<cstring>
#include<map>
using namespace std;
int f(int num){
    if(num<=1) return 0;
    for(int i=2;i*i<=num;i++)
    {
        if(num%i==0)
            return 0;
    }
    return 1;
}
int main(){
    string word;
    cin>>word;
    map<char,int> count;
    for(char i:word)
        count[i]++;
    int max=0,min=100;
    for(auto i= count.begin(); i!= count.end(); ++i)
    {
        max=std::max(max,i->second);
        min=std::min(min,i->second);
    }
    if(f(max-min))
    {
        cout<<"Lucky Word"<<endl;
        cout<<max-min<<endl;
    }
    else{
        cout<<"No Answer"<<endl;
        cout<<"0"<<endl;
    }
    return 0;
}

 

7-4 字符串排序--string类的使用

分数 14

全屏浏览

作者 李廷元

单位 中国民用航空飞行学院

先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串不多于一百个字符。
如果在输入过程中输入的一个字符串为“stop”,也结束输入。
然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。如果存在多个字符串长度相同,则按照原始输入顺序输出。

输入格式:

字符串的个数,以及该组字符串。每个字符串以‘\n’结束。如果输入字符串为“stop”,也结束输入.

输出格式:

可能有多组测试数据,对于每组数据,
将输入的所有字符串按长度由小到大排序输出(如果有“stop”,不输出“stop”)。

输入样例:

4
faeruhyytrjh tjytj
hsrthts   hjnshtgfhs
stop
3
htrskbns
bsartanjsf tyjndyt
nsr jj jtey

输出样例:

faeruhyytrjh tjytj
hsrthts   hjnshtgfhs
htrskbns
nsr jj jtey
bsartanjsf tyjndyt

###提示:
根据输入的字符串个数来动态分配存储空间(采用new()函数)。每个字符串会少于100个字符。
测试数据有多组,注意使用while()循环输入。

###来源:
数据结构高分笔记

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

struct stu {
	string s;
	int id;
};

bool cmp(stu a,stu b) {
	if(a.s.length()==b.s.length()) return a.id>b.id;
	else return a.s.length()<b.s.length();
}
int main() {
	int n;
	string s;
	vector<stu> v;
	while(cin>>n) { //(cin >> n)!=EOF
		getchar();
		while(n--) {
			getline(cin,s);
			if(s=="stop") break;
			stu t;
			t.id=n;
			t.s=s;
			v.push_back(t);
		}
		sort(v.begin(),v.end(),cmp);
		for(int i=0; i<v.size(); i++) {
			cout<<v[i].s<<endl;
		}
		v.clear();
	}
	return 0;
}

 

7-5 办事大厅排队

分数 14

全屏浏览

作者 吴云鹏

单位 郑州大学

在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。

请同学们学习C++ STL中 list相关内容后,编程实践。

输入格式:

第一行一个数字N,表示排队信息或者查询信息条目的数量。

以下N行,每行的内容有以下3种情况

(1) in name 表示名字为name的人员新来到办事大厅,排在队伍的最后。(in和name间存在一个空格,name是名字对应字符串,长度不超过10)。

(2) out 表示当前排在最前面的人已经办理完业务,离开了。

(3) q 表示一次查询,请输出当前正在办理业务的人,也就是队伍的第1个人。如果当前无人办理业务,则输出“NULL”,不包括引号。

输出格式:

请根据以上信息,每次遇到查询时,对应一行输出。如果这时队伍有人,则输出第一个人的姓名,否则输出NULL。

输入样例:

5
in A
out
q
in B
q

输出样例:

在这里给出相应的输出。例如:

NULL
B

#include <iostream>
#include <list>
#include <string>

int main() {
    int n;
    std::cin >> n;

    std::list<std::string> queue;

    for (int i = 0; i < n; i++) {
        std::string operation, name;
        std::cin >> operation;

        if (operation == "in") {
            std::cin >> name;
            queue.push_back(name);
        } else if (operation == "out") {
            if (!queue.empty()) {
                queue.pop_front();
            }
        } else if (operation == "q") {
            if (queue.empty()) {
                std::cout << "NULL" << std::endl;
            } else {
                std::cout << queue.front() << std::endl;
            }
        }
    }

    return 0;
}

7-6 数气球

分数 15

全屏浏览

作者 苏国煜

单位 闽江学院

题目背景

天空上有n个气球,第i个气球的颜色为colori​(为全由小写字母组成的字符串)
请你数出每种颜色的气球的数量,并按照颜色出现的先后顺序进行排序输出。

输入格式:

测试数据有T组(1≤T≤100)。
对于每组样例,第一行一个整数n (1≤n≤1×105)表示气球个数。
接下来接下来n行,每行一个仅有小写字母构成的字符串colori​ (1≤∣colori​∣≤50),代表气球的颜色。

输出格式:

对于每个样例,一种颜色的气球统计结果一行,先输出颜色,用空格隔开后输出该种颜色的气球的数量。

输入样例:

在这里给出一组输入。例如:

2
3
red
red
blue
4
ovo
vvv
ov
ovo

输出样例:

在这里给出相应的输出。例如:

red 2
blue 1
ovo 2
vvv 1
ov 1

#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#define AUTHOR "HEX9CF"
using namespace std;

map<string, int> m1;
queue<string> q1;

int main() {
	int t;
	cin >> t;
	while (t--) {
		m1.clear();
		int n;
		cin >> n;
		while (n--) {
			string col;
			cin >> col;
			if (!m1.count(col)) {
				q1.push(col);
			}
			m1[col]++;
		}
		while (q1.size()) {
			string col = q1.front();
			cout << col << " " << m1[col] << endl;
			q1.pop();
		}
	}
	return 0;
}

 

7-7 利用STL比较数据大小并排序

分数 15

全屏浏览

作者 孙杰

单位 青岛大学

本题目要求读入n个整数(输入数字个数根据输入时随机确定,以输入一个非数字的值作为输入结束标志),利用STL比较数据大小并排序(由小到大升序),然后输出排序后的数据。

输入格式:

输入在一行中依次输入整数值,每个数字之间用空格分隔,输入数字个数根据输入时随机确定,以输入一个非数字的值作为输入结束标志。

输出格式:

先输出一段提示“从标准设备读入数据,直到输入是非整型数据为止”,在输入一组数字后,输出排序后的数字,在一行中由小到大依次输出所有值,数字之间用空格分隔。

输入样例:

10 3 -2 8 20 -9 e

输出样例:

从标准设备读入数据,直到输入是非整型数据为止
 -9 -2 3 8 10 20

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>

int main() {
    std::cout << "从标准设备读入数据,直到输入是非整型数据为止" << std::endl;

    std::vector<int> numbers;
    std::string line;
    getline(std::cin, line);

    std::istringstream iss(line);

    int num;
    while (iss >> num) {
        numbers.push_back(num);
    }

    std::sort(numbers.begin(), numbers.end());

    for (const auto& n : numbers) {
        std::cout << " "<<n;
    }
    std::cout << std::endl;

    return 0;
}

7-8 部分排序

分数 30

全屏浏览

作者 周强

单位 青岛大学

对于一组数据,我们可以只对原先处在中间位置的那些元素进行排序。

输入格式:

在一行内输入n r a1 a2 ... an

其中,不大于200的正整数n表示该组数据的个数;不大于200的非负整数r表示该组数据两端各自留有r个数不参与排序,若r+r>=n,则该组数据无需排序。

整数a1 a2 ... an是该组的n个数据,且都在8位以内。

输出格式:

排序之后的序列,元素之间用一个空格间隔,最后一个元素之后不加空格。

输入样例:

5 1 6 5 4 3 2

输出样例:

6 3 4 5 2
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,r,tmp;
    vector<int> v;
    cin>>n>>r;
    for(int i=0;i<n;i++)
    {
        cin>>tmp;
        v.push_back(tmp);
    }
    if(r+r<n)
    {
        sort(v.begin()+r,v.end()-r);
    }
    cout<<v[0];
    for(int i=1;i<v.size();i++)
    {
        cout<<" "<<v[i];
    }
    return 0;
}

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值