首页 > 其他分享 >PTA L1系列题解(C语言)(L1_081 -- L1_088)

PTA L1系列题解(C语言)(L1_081 -- L1_088)

时间:2024-10-18 19:19:00浏览次数:3  
标签:输出 088 int 题解 样例 a2 L1 输入

L1-081 今天我要赢

题目内容:

2018 年我们曾经出过一题,是输出“2018 我们要赢”。今年是 2022 年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。

输入格式:

本题没有输入。

输出格式:

输出分 2 行。在第一行中输出 I'm gonna win! Today!,在第二行中用 年年年年-月月-日日 的格式输出比赛当天的日期。已知比赛的前一天是 2022-04-22

输入样例:

输出样例(第二行的内容要你自己想一想,这里不给出):

I'm gonna win! Today!
这一行的内容我不告诉你…… 你要自己输出正确的日期呀~

解题思路:

略。

C代码展示:

#include <stdio.h>

int main()
{
	printf("I'm gonna win! Today!\n2022-04-23");
	
	return 0;
}


L1-082 种钻石

题目内容:

2019年10月29日,中央电视台专题报道,中国科学院在培育钻石领域,取得科技突破。科学家们用金刚石的籽晶片作为种子,利用甲烷气体在能量作用下形成碳的等离子体,慢慢地沉积到钻石种子上,一周“种”出了一颗 1 克拉大小的钻石。

本题给出钻石的需求量和人工培育钻石的速度,请你计算出货需要的时间。

输入格式:

输入在一行中给出钻石的需求量 N(不超过 107 的正整数,以微克拉为单位)和人工培育钻石的速度 v(1≤v≤200,以微克拉/天为单位的整数)。

输出格式:

在一行中输出培育 N 微克拉钻石需要的整数天数。不到一天的时间不算在内。

输入样例:

102000 130

输出样例:

784

解题思路:

略。

C代码展示:

#include <stdio.h>

int main()
{
	int n, v;
	scanf("%d %d", &n, &v);
	printf("%d", n/v);
	
	return 0;
}

L1-083 谁能进图书馆

题目内容:

L1-083 谁能进图书馆 - 团体程序设计天梯赛-练习集 (pintia.cn)

为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请你写个程序自动给他们一个回复。

输入格式:

输入在一行中给出 4 个整数:

禁入年龄线 陪同年龄线 询问者1的年龄 询问者2的年龄

这里的禁入年龄线是指严格小于该年龄的儿童禁止入馆;陪同年龄线是指大于等于该年龄的人士可以陪同儿童入馆。默认两个询问者的编号依次分别为 12;年龄和年龄线都是 [1, 200] 区间内的整数,并且保证 陪同年龄线 严格大于 禁入年龄线

输出格式:

在一行中输出对两位询问者的回答,如果可以进就输出 年龄-Y,否则输出 年龄-N,中间空 1 格,行首尾不得有多余空格。

在第二行根据两个询问者的情况输出一句话:

  • 如果两个人必须一起进,则输出 qing X zhao gu hao Y,其中 X 是陪同人的编号, Y 是小孩子的编号;
  • 如果两个人都可以进但不是必须一起的,则输出 huan ying ru guan
  • 如果两个人都进不去,则输出 zhang da zai lai ba
  • 如果一个人能进一个不能,则输出 X: huan ying ru guan,其中 X 是可以入馆的那个人的编号。

输入样例 1:

12 18 18 8

输出样例 1:

18-Y 8-Y
qing 1 zhao gu hao 2

输入样例 2:

12 18 10 15

输出样例 2:

10-N 15-Y
2: huan ying ru guan

解题思路:

本题主要是分类比较麻烦,但是慢慢地一个一个去列还是相对容易的。

总共需要分成6类:
        1.两个人独立地能进。

        2.1带着2进去。

        3.只有1能进去。

        4.2带着1进去。

        5.只有2能进去。

        6.两人都不能进去。

C代码展示:

#include <stdio.h>

int main()
{
	int j, p, a1, a2;
	scanf("%d %d %d %d", &j, &p, &a1, &a2);
	if (a1 >= j && a2>= j) printf("%d-Y %d-Y\nhuan ying ru guan", a1, a2);
	else if (a1 >= j && a1 >= p && a2 < j) 	printf("%d-Y %d-Y\nqing 1 zhao gu hao 2", a1, a2);
	else if (a1 >= j && a1 < p && a2 < j) printf("%d-Y %d-N\n1: huan ying ru guan", a1, a2);
	else if (a1 < j && a2 >= p && a2 >= j) printf("%d-Y %d-Y\nqing 2 zhao gu hao 1", a1, a2);
	else if (a1 < j && a2 < p && a2 >= j) printf("%d-N %d-Y\n2: huan ying ru guan", a1, a2);
	else if (a1 < j && a2 < j) printf("%d-N %d-N\nzhang da zai lai ba", a1, a2);

	return 0;
}

L1-084 拯救外星人

题目内容:

L1-084 拯救外星人 - 团体程序设计天梯赛-练习集 (pintia.cn)

T.jpg

你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“5+7”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。

本题就请你写程序模仿外星人的行为。

输入格式:

输入在一行中给出两个正整数 A 和 B。

输出格式:

在一行中输出 (A+B) 的阶乘。题目保证 (A+B) 的值小于 12。

输入样例:

3 6

输出样例:

362880

解题思路:

它就是一道算阶乘的题,略。

C代码展示:

#include <stdio.h>

int main()
{
	int a, b, ans=1;
	scanf("%d %d", &a, &b);
	for (int i=1; i<=a+b; i++){
		ans *= i;
	}
	printf("%d", ans);
	
	return 0;
}

L1-085 试试手气

题目内容:

L1-085 试试手气 - 团体程序设计天梯赛-练习集 (pintia.cn)

sz.png

我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:

  • 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
  • 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。

那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。

输入格式:

输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。

输出格式:

在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。

输入样例:

3 6 5 4 1 4
3

输出样例:

4 3 3 3 4 3

样例解释:

这 3 次摇出的结果依次为:

6 5 6 6 6 6
5 4 4 5 5 5
4 3 3 3 4 3

解题思路:

这题中每次投掷的结果都会减一,然后它还有一个初始值在,所以在投掷完每次之后,与初始值比较,如果比它大就说明不会受到它的影响,如果比它小就需要减一,因为那个数已经出现过。

或者也可以采用模拟的方式来解决这道题,但相对来说算法有点慢。

  1. 读取6个初始值存入数组init中。
  2. 读取一个整数n
  3. 使用一个循环计算前6个位置的结果,并输出。
  4. 单独计算第7个位置的结果,并输出。

C代码展示:

#include <stdio.h>

int main() {
    int init[10], ans, n; // 定义一个数组init,变量ans用于存储每次计算的结果,变量n用于存储投掷次数
    for (int i = 1; i <= 6; i++) { // 循环读取6个初始值
        scanf("%d", &init[i]); // 读取初始值并存入数组init
    }
    scanf("%d", &n); // 读取整数n
    for (int i = 1; i < 6; i++) {
        ans = 7 - n; // 计算基础值
        if (ans <= init[i]) ans--; // 如果计算的基础值小于等于当前位置的初始值,则减1
        printf("%d ", ans);
    }
    ans = 7 - n;
    if (ans <= init[6]) ans--; // 如果计算的基础值小于等于初始值,则减1
    printf("%d\n", ans);

    return 0;
}

L1-086 斯德哥尔摩火车上的题

题目内容:

L1-086 斯德哥尔摩火车上的题 - 团体程序设计天梯赛-练习集 (pintia.cn)

tt.png

上图是新浪微博上的一则趣闻,是瑞典斯德哥尔摩火车上的一道题,看上去是段伪代码:

s = ''
a = '1112031584'
for (i = 1; i < length(a); i++) {
  if (a[i] % 2 == a[i-1] % 2) {
    s += max(a[i], a[i-1])
  }
}
goto_url('www.multisoft.se/' + s)

其中字符串的 + 操作是连接两个字符串的意思。所以这道题其实是让大家访问网站 www.multisoft.se/112358注意:比赛中千万不要访问这个网址!!!)。

当然,能通过上述算法得到 112358 的原始字符串 a 是不唯一的。本题就请你判断,两个给定的原始字符串,能否通过上述算法得到相同的输出?

输入格式:

输入为两行仅由数字组成的非空字符串,长度均不超过 104,以回车结束。

输出格式:

对两个字符串分别采用上述斯德哥尔摩火车上的算法进行处理。如果两个结果是一样的,则在一行中输出那个结果;否则分别输出各自对应的处理结果,每个占一行。题目保证输出结果不为空。

输入样例 1:

1112031584
011102315849

输出样例 1:

112358

输入样例 2:

111203158412334
12341112031584

输出样例 2:

1123583
112358

解题思路:

整体就是按照题目给出的计算公式来进行运算,将它给出的伪代码改写成计算机语言。

  1. 读取两个字符串a[1]a[2]
  2. 对于每个字符串,遍历其每个字符,检查与前一个字符的奇偶性是否相同。
  3. 如果奇偶性相同,选择较大的字符加入到结果字符串s[j]中。
  4. 比较两个结果字符串s[1]s[2]是否相同。
  5. 根据比较结果,输出相应的字符串。

C代码展示:

#include <stdio.h>
#include <string.h>

// 定义一个函数max,用于返回两个字符中较大的一个
char max(char s, char f) {
    if (s > f) return s;
    else return f;
}

int main() {
    char a[5][10005], s[5][10005]; // 定义两个二维字符数组a和s,用于存储输入的字符串和结果字符串
    int k=0; // 定义变量k,用于记录结果字符串的长度
    scanf("%s\n%s", a[1], a[2]); // 读取两个字符串,存储在a[1]和a[2]中

    for (int j=1; j<=2; j++) { // 遍历两个输入字符串
        for (int i=1, k=0; i<strlen(a[j]); i++) { // 遍历字符串的每个字符
            if ((a[j][i]-'0') % 2 == (a[j][i-1]-'0') % 2) { // 如果当前字符和前一个字符的奇偶性相同
                s[j][k] = max(a[j][i], a[j][i-1]); // 将较大的字符加入到结果字符串s[j]中
                k++; // 增加结果字符串的长度
            }
        }
    }
    if (strcmp(s[1], s[2]) == 0) { // 比较两个结果字符串是否相同
        printf("%s\n", s[1]); // 如果相同,输出s[1]
    } else {
        printf("%s\n%s\n", s[1], s[2]); // 如果不同,分别输出s[1]和s[2]
    }

    return 0;
}

L1-087 机工士姆斯塔迪奥

题目内容:

L1-087 机工士姆斯塔迪奥 - 团体程序设计天梯赛-练习集 (pintia.cn)

在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。

你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。

给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

输入格式:

输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。

接下来 Q 行,每行两个数 Ti​,Ci​,其中 Ti​=0 表示 BOSS 选择的是一整行,Ti​=1 表示选择的是一整列,Ci​ 为选择的行号/列号。行和列的编号均从 1 开始。

输出格式:

输出一个数,表示安全格子的数量。

输入样例:

5 5 3
0 2
0 4
1 3

输出样例:

12

解题思路:

这道题它题目描述的意思和咱小时候写的分割长方形类似,就是在一个长方形内开几条路。

就类似于上图的解决方法。

注意点:题目中会出现重复的行和列,我们还需要去记录已经被攻击的行和列,避免重复记录,对于这一点,我采用了哈希表的方式来记录。

  1. 读取区域的行数n、列数m和操作数量q
  2. 使用一个循环读取每个操作,包括操作类型t和操作编号c
  3. 根据操作类型,更新对应的行或列操作记录,并增加操作数量。
  4. 计算最终的区域覆盖数量,公式为:总区域数量减去被行操作覆盖的数量再减去被列操作覆盖的数量,再加上同时被行和列操作覆盖的数量(因为这些区域被重复减去了)。
  5. 输出最终的区域覆盖数量。

C代码展示:

#include <stdio.h>

int main() {
    int n, m, q, r[100005] = {0}, r_num = 0, l[100005] = {0}, l_num = 0; // 定义变量n(行数)、m(列数)、q(操作数量),r(记录行操作)和l(记录列操作)
    scanf("%d %d %d", &n, &m, &q); // 读取行数、列数和操作数量

    for (int i = 0; i < q; i++) { // 循环读取每个操作
        int t, c; // 定义变量t(操作类型)和c(操作编号)
        scanf("%d %d", &t, &c); // 读取操作类型和编号
        if (t == 0) { // 如果是行操作
            if (r[c] == 0) { // 如果编号c的行之前没有被操作过
                r[c] = 1; // 标记为已操作
                r_num++; // 增加行操作数量
            }
        } else { // 如果是列操作
            if (l[c] == 0) { // 如果编号c的列之前没有被操作过
                l[c] = 1; // 标记为已操作
                l_num++; // 增加列操作数量
            }
        }
    }
    printf("%d", n * m - n * l_num - m * r_num + l_num * r_num); // 输出最终的区域覆盖数量

    return 0;
}

L1-088 静静的推荐

题目内容:

L1-088 静静的推荐 - 团体程序设计天梯赛-练习集 (pintia.cn)

给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?

输入格式:

输入第一行给出 3 个正整数:N(≤105)为参赛学生人数,K(≤5×103)为企业接受的推荐批次,S(≤100)为该企业的 PAT 面试分数线。

随后 N 行,每行给出两个分数,依次为一位学生的天梯赛分数(最高分 290)和 PAT 分数(最高分 100)。

输出格式:

在一行中输出静静姐最多能向企业推荐的学生人数。

输入样例:

10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100

输出样例:

8

样例解释:

第一批可以选择 175、189、203、256 这四个分数的学生各一名,此外 175 分 PAT 分数达到 90 分的学生和 189 分 PAT 分数达到 95 分的学生可以额外进入名单。第二批就只剩下 175、189 两个分数的学生各一名可以进入名单了。最终一共 8 人进入推荐名单。

解题思路:

 根据题意可以进行三次分类:

1、天梯赛成绩小于175的直接刷掉,不需要进行考虑。

2、天梯赛成绩大于等于175且pta成绩>=s,这类人可以直接进入,不用管人数限制。

3、天梯赛成绩大于等于175且pta成绩<s,把这个分数的人数统计一下,与批次s比较,当人数小于录入批次时,可以直接录入,大于时录入录入批次人数。

然后下面是代码逻辑:

  1. 读取用户输入的数据对数量n、额外得分次数k和最低得分要求s
  2. 使用一个循环读取每个数据对的成绩a和得分b
  3. 如果成绩a大于或等于175,则增加该成绩在数组g中的计数。
  4. 检查该成绩是否之前出现过,如果没有,则将其添加到数组p中,并增加计数器x
  5. 如果成绩a大于或等于175且得分b大于或等于s,则增加得分计数ans,并减少该成绩在数组g中的计数。
  6. 使用另一个循环处理数组p中的每个成绩,如果该成绩的计数大于k,则增加k到得分计数ans中;否则,增加该成绩的计数到得分计数ans中。
  7. 输出最终的得分计数ans

C代码展示:

#include <stdio.h>

int main() {
    int n, k, s, x=0, ans=0, g[300]={0}, p[300]; // 定义变量n(数据对数量),k(额外得分次数),s(最低得分要求),x(成绩分数计数),ans(得分计数),g(成绩分数数量数组),p(成绩分数数组)
    scanf("%d %d %d", &n, &k, &s); // 读取数据对数量、额外得分次数和最低得分要求
    for (int i=0; i<n; i++) { // 循环读取每个数据对
        int a, b; // 定义变量a(身高)和b(得分)
        scanf("%d %d", &a, &b); // 读取成绩和PAT分数
        if (a >= 175) { // 如果成绩大于或等于175
            g[a]++; // 增加该成绩在数组g中的计数
            int flag = 0; // 初始化标志变量flag
            for (int j=0; j<x && flag == 0; j++) { // 检查该成绩是否之前出现过
                if (a == p[j]) flag = 1; // 如果出现过,则设置flag为1
            }
            if (flag == 0) { // 如果没有出现过
                p[x] = a; // 将成绩添加到数组p中
                x++; // 增加成绩分数计数
            }
        }
        if (a >= 175 && b >= s) { // 如果成绩大于或等于175且PAT分数大于或等于s
            ans++; // 增加得分计数
            g[a]--; // 减少该成绩在数组g中的计数
        }
    }

    for (int i=0; i<x; i++) { // 循环处理数组p中的每个成绩
        if (g[p[i]] > k) ans += k; // 如果该成绩的计数大于k,则增加k到得分计数中
        else ans += g[p[i]]; // 否则,增加该成绩的计数到得分计数中
    }
    printf("%d", ans); // 输出最终的得分计数

    return 0;
}

标签:输出,088,int,题解,样例,a2,L1,输入
From: https://blog.csdn.net/sikimayi/article/details/142913630

相关文章

  • ext-ms-win-ntuser-powermanagement-l1-1-0.dll:电源管理的基石,丢失后的全面修复手册
    ext-ms-win-ntuser-powermanagement-l1-1-0.dll是Windows操作系统中负责电源管理功能的核心动态链接库文件。当这个文件丢失或损坏时,可能会导致系统的电源管理功能出现异常,影响电脑的续航能力、性能表现以及用户的整体使用体验。以下是对该DLL文件丢失问题的全面解析与修复指南......
  • P1955 程序自动分析 题解
    P1955程序自动分析一道并查集的裸题,并查集存储传递性,后判断。主题思路十分简单,重点在于离散化与离线的处理。离散化,为什么会想到离散化呢,观察数据范围\(1<i,j<{10}^9\),数据范围过大,导致数组不可能开到\(1e9\)但是\(1<n<1e5\)考虑到每次输入只有两个数,若每个数都两两不同,......
  • 【题解】[Codechef] Beautiful Permutation
    传送门以此纪念我场切的dp。这种计数的类型一看就很dp的样子。考场上一开始设的dp状态是\(dp_{i,j,k_1,k_2,0/1}\)表示将前\(i\)个数分为\(j\)段,放了\(k_1\)个偶数,\(k_2\)个奇数,当前段为偶数段或奇数段的方案数。考虑如何转移,记\(cnt_0\)表示序列中可填入的偶数......
  • Codeforces Round 892 (Div. 2)题解记录
    题目链接:https://codeforces.com/contest/1859A.UnitedWeStand选最大的数即可注意题目输出格式 #include<iostream> #include<string.h> #include<map> #include<vector> #include<set> #include<unordered_set> #include<stack> #incl......
  • P5025 [SNOI2017] 炸弹 题解
    题意link.题解一个好想一点的正解。考虑到可能连锁爆炸,我们不能通过一个单纯的二分来解决问题。考虑dp。记\(f(i)\)为第\(i\)个点爆炸,最远能引爆到哪个坐标小于它的点。\(g(i)\)为第\(i\)个点爆炸,最远能引爆到哪个坐标大于它的点。我们以\(f\)为例,\(g\)可以通......
  • AT_nikkei2019_2_qual_c 题解
    blog。不会做结论题,怎么办???不会做结论题,怎么办???不会做结论题,怎么办???不妨对\(b\)排序,将\(a\)对应到相应的位置。那么题目有两个条件:#1:\(\foralla_i\leb_i\)。#2:操作限制。注意到\(n-1\)次操作就能完成对\(a\)排序。所以用\(n-2\)次操作可以将\(a\)变成一个Almos......
  • P9351 [JOI 2023 Final] Maze 题解
    Description给定一张\(R\timesC\)的地图,其中.可以走,而#不能走。一次操作可以将\(N\timesN\)的正方形范围内所有点变成.,给定起点和终点,求最少需要几次操作使得起点和终点连通(只能上下左右移动)。\(R\timesC\le6\times10^6\),\(N\leR\leC\)。Solution先考虑怎么......
  • CF571B-题解
    CF571B题意给定数组\(A\)和值\(k\),你可以重排\(A\)中的元素,使得\(\displaystyle\sum_{i=1}^{n-k}|A_i-A_{i+k}|\)最小。输出最小值。思路\(A_i,A_{i+k}\)就等同于在将\(i\)模\(k\)的意义上把\(A\)分为若干组贪心的想要使\(\displaystyle\sum_{i=1}^{n-k}|A_i-A......
  • 【题解】Solution Set - NOIP2024集训Day56 哈希杂题
    【题解】SolutionSet-NOIP2024集训Day56哈希杂题https://www.becoder.com.cn/contest/5640「CF568C」NewLanguage做过的2-sat。「NOI2024」集合做过。做法见提交记录。「CSP-S2022」星战简要题意:给定有向图。修改使一条边失效/恢复;使一个点的所有入边......
  • [YDOI R1] Necklace 题解
    题目传送门前置芝士二项式定理:\((a+b)^n=\sum\limits_{i=0}^{n}C^i_n\timesa^i\timesb^{n-i}\)快速幂Meaning有\(n\)种珠子,每种有\(a_i\)颗,且美丽值为\(v_i\)。任意两颗珠子不同(同种类也算不同)。每种珠子有一个漂亮值\(v_i\)。项链有一个美丽度,若第\(i\)种珠子......