========================================================================
答案和更多内容请查看网站:【试卷中心 -----> 电子学会 ----> C/C++ ----> 五级】
青少年软件编程历年真题模拟题实时更新
=======================================================================
青少年软件编程(C/C++)5级等级考试真题试卷(2024年6月)
编程题
第 1 题 列车调度题目描述
火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有 9 趟列车,在入口处按照 { 8,4,2,5,3,9,1,6,7 } 的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
输入
输入第一行给出一个整数 N (2 ≤ N ≤ 105),下一行给出从 1 到 N的整数序号的一个重排列。数字间以空格分隔。
输出
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
样例输入
9
8 4 2 5 3 9 1 6 7
样例输出
4
查看答案
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n] = {0};
int x;//每次输入的列车序号
int t = 0;
for (int i = 0; i < n; i++)
{
cin >> x;
if (t == 0 || a[t - 1] < x) //t-1是因为a[t]是0,a[t-1]才是真正的序号
//如果最后一个道路的最后一个元素都比x小,
//说明前几条道路也没有能容下x的了
{
a[t] = x; //第一个进去的,一定是这一列最大的
// printf("t=%d a[%d]=%d x=%d\n",t,i,a[i],x);
t++;
}
int l = 0, r = t, mid; //t代表了当前开辟的道路的数量
while (l < r)
{
mid = (r - l) / 2 + l;
if (x <= a[mid])
{
r = mid;
}
else
l = mid+1 ;
}
a[l] = x;
//测试用:
// for (int j = 0; j < t; j++)
// {
// cout << a[j] << ' ';
// }
// cout << endl;
}
cout << t;
return 0;
}
第 2 题 实验室使用排期
受新冠疫情影响,当前大家的活动都必须注意保持充分的社交距离,国家实验室的使用也同样受到了严格的限制。假设规定任何一个时间点上,实验室内最多只能有 1 个人,且每个人都必须提前申请实验室的使用,只有申请被批准后才能进入。现给定一批第二天的实验室使用申请,你需要写个程序自动审批,使得能够被批准的申请数量最大化。
输入格式:
输入第一行首先给出一个正整数 N(≤2×103),为申请总量。随后 N 行,每行按以下格式给出申请信息:
hh:mm:ss hh:mm:ss
Copy
其中 hh:mm:ss 表示一天内的时间点"小时:分钟:秒钟",最早从 00:00:00 开始,最晚到 23:59:59 结束。第一个时间点为进入实验室的时间,第二个是离开时间。题目保证离开时间在进入时间之后。
注意所有时间都在一天之内。时间按 24 小时显示。
输出格式:
在一行中输出能够被批准的最大申请数量。
输入样例:
7
18:00:01 23:07:01
04:09:59 11:30:08
11:35:50 13:00:00
23:45:00 23:55:50
13:00:00 17:11:22
06:30:50 11:42:01
17:30:00 23:50:00
输出样例:
5
样例解释:
除了最后两个申请,其它都可以被批准。
查看答案
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct ff{
int a,b;
}a[10010];
int f(string s){
int sum=0;
sum+=((s[0]-'0')*10+(s[1]-'0'))*3600;
sum+=((s[3]-'0')*10+(s[4]-'0'))*60;
sum+=(s[6]-'0')*10+(s[7]-'0');
return sum;
}
bool cmp(ff p,ff q){
if(p.b==q.b) return p.a<q.a;
return p.b<q.b;
}
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
string x,y;
cin>>x>>y;
a[i].a=f(x);
a[i].b=f(y);
}
sort(a+1,a+n+1,cmp);
int cnt=1;
int t=a[1].b;
for(int i=2;i<=n;i++){
if(a[i].a>=t){
cnt++;
t=a[i].b;
}
}
cout<<cnt;
}
========================================================================
答案和更多内容请查看网站:【试卷中心 -----> 电子学会 ----> C/C++ ----> 五级】
青少年软件编程历年真题模拟题实时更新
=======================================================================