天梯初级练习题目 7-101 ~ 7-110 含全部测试点

7-101 计算平均成绩 分数 15

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。

输入格式:

输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。

输出格式:

首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。

输入样例:

5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60

输出样例:

80.00
zhang 00001
chen 21987

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm>
using namespace std;

typedef struct Data
{
    string num, name;
    int score;
}node;
vector<node> st;
int n;
double ans;

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n;
    while(n --)
    {
        string a, b;
        int c;
        cin >> a >> b >> c;
        st.push_back({a, b, c});
        ans += c;
    }
    ans /= st.size();

    // 精确到小数点后2位
    cout << fixed << setprecision(2) << ans << endl;
    for(auto c : st)
        if(c.score < ans) cout << c.name << " " << c.num << endl;
    return 0;
}

7-102 查找书籍 分数 20

给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。

输入格式:

输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。

输出格式:

在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。

输入样例:

3
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
25.0

输出样例:

25.00, Programming in Delphi
18.50, Programming in VB

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <string>
using namespace std;
int n;
string input;
string mx, mn;
double dx, dn = 1e8;

int main()
{
    cin >> n; getchar();
    while(n --)
    {
        getline(cin, input);
        double temp; cin >> temp; getchar(); // 吸收换行符
        if(dx < temp) dx = temp, mx = input;
        if(dn > temp) dn = temp, mn = input;
    }
    printf("%.2lf, %s\n", dx, mx.c_str());
    printf("%.2lf, %s\n", dn, mn.c_str());
    return 0;
}

7-103 有理数比较 分数 10

本题要求编写程序,比较两个有理数的大小。

输入格式:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:

在一行中按照“a1/b1 关系符 a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“<”表示“小于”,“=”表示“等于”。

输入样例1:

1/2 3/4

输出样例1:

1/2 < 3/4

输入样例2:

6/8 3/4

输出样例2:

6/8 = 3/4

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <string>
using namespace std;
string a, b;
double da, db;

int main()
{
    cin >> a >> b;
    int p1 = a.find('/'), p2 = b.find('/');

    // 转换成string,找分割点,字符串分割后转int比较
    int a1 = stoi(a.substr(0, p1)), a2 = stoi(a.substr(p1 + 1));
    int b1 = stoi(b.substr(0, p2)), b2 = stoi(b.substr(p2 + 1));
    da = (double)a1 / a2, db = (double)b1 / b2;
    if(da < db) cout << a << " < " << b << endl;
    else if(da > db) cout << a << " > " << b << endl;
    else cout << a << " = " << b << endl;
    return 0;
}

7-104 平面向量加法 分数 15

本题要求编写程序,计算两个二维平面向量的和向量。

输入格式:

输入在一行中按照“x1​ y1​ x2​ y2​”的格式给出两个二维平面向量v1​=(x1​,y1​)和v2​=(x2​,y2​)的分量。

输出格式:

在一行中按照(x, y)的格式输出和向量,坐标输出小数点后一位(注意不能输出−0.0)。

输入样例:

3.5 -2.7 -13.9 8.7

输出样例:

(-10.4, 6.0)

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
double x, y;
double a, b;

int main()
{
    cin >> x >> y >> a >> b;
    double ra = a + x, rb = b + y;
    if(abs(ra) < 0.05) ra = 0.0;
    if(abs(rb) < 0.05) rb = 0.0;
    printf("(%.1lf, %.1lf)\n", ra, rb);
    return 0;
}

7-105 找出总分最高的学生 分数 15

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

输入格式:

输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。

输出格式:

在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

输入样例:

5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75

输出样例:

zhangfeng 10001 258

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef struct Data
{
    string num, name;
    int sum;
}node;
vector<node> st;
int n;

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n;
    for(int i = 1; i <= n; ++ i)
    {
        string a, b;
        int c, d, e;
        cin >> a >> b >> c >> d >> e;
        st.push_back({a, b, c + d + e});
    }
    sort(st.begin(), st.end(), [&](node& a, node& b)->bool
         {
             return a.sum > b.sum;
         });
    cout << st.front().name << " " << st.front().num << " " << st.front().sum << endl;
    return 0;
}

7-106 通讯录排序 分数 20

输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。

输入格式:

输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+-组成的字符串。

输出格式:

按照年龄从大到小输出朋友的信息,格式同输出。

输入样例:

3
zhang 19850403 13912345678
wang 19821020 +86-0571-88018448
qian 19840619 13609876543

输出样例:

wang 19821020 +86-0571-88018448
qian 19840619 13609876543
zhang 19850403 13912345678

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef struct Data
{
    string a, b, c;
}node;
vector<node> st;
int n;

// 简单结构体排序

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n;
    for(int i = 1; i <= n; ++ i)
    {
        string a, b, c;
        cin >> a >> b >> c;
        st.push_back({a, b, c});
    }
    sort(st.begin(), st.end(), [&](node& a, node& b)->bool
         {
             return a.b < b.b;
         });
    for(auto c : st)
        printf("%s %s %s\n", c.a.c_str(), c.b.c_str(), c.c.c_str());
    return 0;
}

7-107 英文单词排序 分数 25

本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:

输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:

输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:

blue
red
yellow
green
purple
#

输出样例:

red blue green yellow purple 

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <queue>
using namespace std;
string input;

typedef struct Data
{
    int size, id;
    string name;
    Data(int a, int b, string c) : size(a), id(b), name(c) {}
    bool operator<(const Data& W) const
    {
        if (size == W.size) return id > W.id;
        return size > W.size;
    }
}node;
priority_queue<node, vector<node>> heap;
int cnt;

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    while (cin >> input, input != "#")
        heap.push(node( input.size(), cnt++, input ));
    while (heap.size())
        printf("%s ", heap.top().name.c_str()), heap.pop();
    return 0;
}

7-108 藏头诗 分数 15

本题要求编写一个解密藏头诗的程序。

注:在 2022 年 7 月 14 日 16 点 50 分以后,该题数据修改为 UTF-8 编码。

输入格式:

输入为一首中文藏头诗,一共四句,每句一行。注意:一个汉字占三个字节。

输出格式:

取出每句的第一个汉字并连接在一起形成一个字符串并输出。同时在末尾输入一个换行符。

输入样例:

一叶轻舟向东流
帆稍轻握杨柳手
风纤碧波微起舞
顺水任从雅客流

输出样例:

一帆风顺

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <string>
using namespace std;
string input;
string ans;

// 按字大小分割后拼接即可
int main()
{
    while(getline(cin, input))
        ans += input.substr(0, 3);
    cout << ans << endl;
    return 0;
}

7-109 自动售货机 分数 30

如图所示的简易自动售货机,物品架1、2上共有10样商品,按顺序进行编号分别为1-10,标有价格与名称,一个编号对应一个可操作按钮,供选择商品使用。如果物架上的商品被用户买走,储物柜中会自动取出商品送到物架上,保证物品架上一定会有商品。用户可以一次投入较多钱币,并可以选择多样商品,售货机可以一次性将商品输出并找零钱。

1.jpg

用户购买商品的操作方法是:

(1)从“钱币入口”放入钱币,依次放入多个硬币或纸币。钱币可支持1元(纸币、硬币)、2元(纸币)、5元(纸币)、10元(纸币),放入钱币时,控制器会先对钱币进行检验识别出币值,并统计币值总额,显示在控制器显示屏中,提示用户确认钱币放入完毕;

(2)用户确认钱币放入完毕,便可选择商品,只要用手指按对应商品外面的编号按钮即可。每选中一样商品,售货机控制器会判断钱币是否足够购买,如果钱币足够,自动根据编号将物品进行计数和计算所需钱币值,并提示余额。如果钱币不足,控制器则提示“Insufficient money”。用户可以取消购买,将会把所有放入钱币退回给用户。

输入格式:

先输入钱币值序列,以-1作为结束,再依次输入多个购买商品编号,以-1结束。

输出格式:

输出钱币总额与找回零钱,以及所购买商品名称及数量。

输入样例:

1 1 2 2 5 5 10 10 -1
1 2 3 5 1 6 9 10 -1

输出样例:

Total:36yuan,change:19yuan
Table-water:2;Table-water:1;Table-water:1;Milk:1;Beer:1;Oolong-Tea:1;Green-Tea:1;

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
int tot, ans;

// 利用map映射{对应序号,{数量,金额}}这一键值对 即可解决
string nt[] =
{ "",
	"Table-water", "Table-water", "Table-water", "Coca-Cola",
	"Milk", "Beer", "Orange-Juice", "Sprite", "Oolong-Tea",
	"Green-Tea"
};
unordered_map<int, pair<int, int>> mp
{
	{1, {0, 1}}, {2, {0, 1}},
	{3, {0, 1}}, {4, {0, 2}},
	{5, {0, 2}}, {6, {0, 3}},
	{7, {0, 3}}, {8, {0, 3}},
	{9, {0, 4}}, {10, {0, 4}}
};

int main()
{
	ios::sync_with_stdio(false), cin.tie(0);
	int e; while (cin >> e, e != -1) tot += e;
	while (cin >> e, e != -1)
		mp[e].first++, ans += mp[e].second;
	if (ans > tot)
	{
		puts("Insufficient money");
		return 0;
	}
	printf("Total:%dyuan,change:%dyuan\n", tot, tot - ans);
	for (int i = 1; i <= 10; ++i)
		if (mp[i].first)
			printf("%s:%d;", nt[i].c_str(), mp[i].first);
	return 0;
}

7-110 停车场管理 分数 50

设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后次序依次从停车场最里面向大门口处停放 (即最先到达的第一辆车停放在停车场的最里面) 。如果停车场已放满n辆车,则以后到达的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车可以进入停车场。停车场内如有某辆车要开走,则在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费,停留在便道上的车不收停车费。编写程序对该停车场进行管理。

输入格式:

先输入一个整数n(n<=10),再输入若干组数据,每组数据包括三个数据项:汽车到达或离开的信息(A表示到达、D表示离开、E表示结束)、汽车号码、汽车到达或离开的时刻。

输出格式:

若有车辆到达,则输出该汽车的停车位置;若有车辆离开,则输出该汽车在停车场内停留的时间。如果汔车号码不存在,输出the car not in park

输入样例:

3
A 1 1 
A 2 2
A 3 3
D 1 4
A 4 5
A 5 6
D 4 7
D 5 8
E 0 0

输出样例:

car#1 in parking space #1
car#2 in parking space #2
car#3 in parking space #3
car#1 out,parking time 3
car#4 in parking space #3
car#5 waiting
car#4 out,parking time 2
car#5 in parking space #3
car#5 out,parking time 1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
queue<PII> wait;
stack<PII> st, load;
int n;
char op;
int e, tt;

// 数据结构题,使用容器或手写数组模拟均可
// stack维护停车场,queue维护大门外便道,利用另一个stack保持停车场内各车的相对顺序即可解决
int main()
{
	ios::sync_with_stdio(false), cin.tie(0);
	cin >> n;
	while (cin >> op >> e >> tt, op != 'E')
	{
		if (op == 'A')
		{
			if (st.size() < n)
			{
				st.push({ e, tt });
				printf("car#%d in parking space #%d\n",
					e, st.size());
			}
			else
			{
				printf("car#%d waiting\n", e);
				wait.push({ e, tt });
			}
		}
		else if (op == 'D')
		{
			while (st.size() && st.top().first != e)
				load.push(st.top()), st.pop();
			if (st.empty())
			{
				puts("the car not in park");
				while (load.size()) st.push(load.top()), load.pop();
				continue;
			}
			int id = st.top().first, hd = st.top().second; 
			st.pop();
			while (load.size()) st.push(load.top()), load.pop();
			if (id != e) continue;
			printf("car#%d out,parking time %d\n", id, tt - hd);

			if (wait.size())
			{
				PII node = wait.front();
				node.second = tt;
				st.push(node);
				printf("car#%d in parking space #%d\n",
					wait.front().first, st.size());
				wait.pop();
			}
		}
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值