written by: 东篱下の悠然

L1-1 嫑废话上代码 (5分)

Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。

输入格式:
本题没有输入。

输出格式:
在一行中输出 Talk is cheap. Show me the code.。

输入样例:

输出样例:

Talk is cheap. Show me the code.

ans:

#include <bits/stdc++.h>
using namespace std;int main() {return cout << "Talk is cheap. Show me the code.", 0;
}

L1-2 猫是液体 (5分)


测量一个人的体积是很难的,但猫就不一样了。因为猫是液体,所以可以很容易地通过测量一个长方体容器的容积来得到容器里猫的体积。本题就请你完成这个计算。

输入格式:
输入在第一行中给出 3 个不超过 100 的正整数,分别对应容器的长、宽、高。

输出格式:
在一行中输出猫的体积。

输入样例:

23 15 20

输出样例:

6900

ans:

#include <bits/stdc++.h>
using namespace std;int main() {int a, b, c;cin >> a >> b >> c;cout << a * b * c;return 0;
}

L1-3 洛希极限 (10分)

科幻电影《流浪地球》中一个重要的情节是地球距离木星太近时,大气开始被木星吸走,而随着不断接近地木“刚体洛希极限”,地球面临被彻底撕碎的危险。但实际上,这个计算是错误的。

洛希极限(Roche limit)是一个天体自身的引力与第二个天体造成的潮汐力相等时的距离。当两个天体的距离少于洛希极限,天体就会倾向碎散,继而成为第二个天体的环。它以首位计算这个极限的人爱德华·洛希命名。(摘自百度百科)

大天体密度与小天体的密度的比值开 3 次方后,再乘以大天体的半径以及一个倍数(流体对应的倍数是 2.455,刚体对应的倍数是 1.26),就是洛希极限的值。例如木星与地球的密度比值开 3 次方是 0.622,如果假设地球是流体,那么洛希极限就是 0.622×2.455=1.52701 倍木星半径;但地球是刚体,对应的洛希极限是 0.622×1.26=0.78372 倍木星半径,这个距离比木星半径小,即只有当地球位于木星内部的时候才会被撕碎,换言之,就是地球不可能被撕碎。

本题就请你判断一个小天体会不会被一个大天体撕碎。

输入格式:
输入在一行中给出 3 个数字,依次为:大天体密度与小天体的密度的比值开 3 次方后计算出的值(≤1)、小天体的属性(0 表示流体、1 表示刚体)、两个天体的距离与大天体半径的比值(>1 但不超过 10)。

输出格式:
在一行中首先输出小天体的洛希极限与大天体半径的比值(输出小数点后2位);随后空一格;最后输出 ^ _ ^ 如果小天体不会被撕碎,否则输出 T_T。

输入样例 1:

0.622 0 1.4

输出样例 1:

1.53 T_T

输入样例 2:

0.622 1 1.4

输出样例 2:

0.78 ^_^

很美丽的一道题,美丽到极容易被迷住…
写法:输入一个已经开好三次方的值a,小天体质体属性b,一个距离的比值c,拿a 和 对应属性的倍数相乘得到的数,就是洛希极限;
洛希极限和距离比值c比较,大于c即撕碎:输出哭脸;小于c不会撕碎:输出笑脸。

ans:

#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;int main() {double a, c;int b;cin >> a >> b >> c;if(b == 0) { //流体 double ans = a * 2.455; //洛希极限 if(ans > c) {printf("%.2f T_T", ans);}else {printf("%.2f ^_^", ans);}}else { //刚体 double ans = a * 1.26; //洛希极限 if(ans > c) {printf("%.2f T_T", ans);}else {printf("%.2f ^_^", ans);}        }return 0;
}

L1-4 调和平均 (10分)

N 个正数的算数平均是这些数的和除以 N,它们的调和平均是它们倒数的算数平均的倒数。本题就请你计算给定的一系列正数的调和平均值。

输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (≤1000);第 2 行给出 N 个正数,都在区间 [0.1,100] 内。

输出格式:
在一行中输出给定数列的调和平均值,输出小数点后2位。

输入样例:

8
10 15 12.7 0.3 4 13 1 15.6

输出样例:

1.61

tips:倒数即取它分之一

ans:

#include <bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;double t, ans;for(int i = 0; i < n; i ++) {cin >> t;ans += (1 / t); //每个数的倒数加起来}printf("%.2f", 1 / (ans / n)); //的平均数再取倒数return 0;
}

L1-5 胎压监测 (15分)

小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。

让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压,并给出正确的报警信息。报警规则如下:

如果所有轮胎的压力值与它们中的最大值误差在一个给定阈值内,并且都不低于系统设定的最低报警胎压,则说明情况正常,不报警;
如果存在一个轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则不仅要报警,而且要给出可能漏气的轮胎的准确位置;
如果存在两个或两个以上轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则报警要求检查所有轮胎。
输入格式:
输入在一行中给出 6 个 [0, 400] 范围内的整数,依次为 1~4 号轮胎的胎压、最低报警胎压、以及胎压差的阈值。

输出格式:
根据输入的胎压值给出对应信息:

如果不用报警,输出 Normal;
如果有一个轮胎需要报警,输出 Warning: please check #X!,其中 X 是出问题的轮胎的编号;
如果需要检查所有轮胎,输出 Warning: please check all the tires!。

输入样例 1:

242 251 231 248 230 20

输出样例 1:

Normal

输入样例 2:

242 251 232 248 230 10

输出样例 2:

Warning: please check #3!

输入样例 3:

240 251 232 248 240 10

输出样例 3:

Warning: please check all the tires!

思路:
输入的时候找出最大值;
遍历四个轮胎按照要求检查(和最大值的误差在阈值内,并且都大于最低值)
找到一个个数加一
没找到,输出样例1;
找到个数为1,输出样例2;
找到1个以上,输出样例3。

ans:

#include <bits/stdc++.h>
using namespace std;int num[4]; //四个轮胎
int maxx = -10; //四个轮胎里面的最大值int main() {for(int i = 0; i < 4; i ++) {cin >> num[i];maxx = max(num[i], maxx); //找最大值}int x, y;cin >> x >> y;int cnt = 0, flag = 0;for(int i = 0; i < 4; i ++) {if((maxx - num[i]) > y || num[i] < x) { //和最大值的误差在阈值内,并且都大于最低值flag ++;cnt = i;}}if(flag == 0) { //没找到cout << "Normal";}else if(flag == 1) { //找到一个cout << "Warning: please check #" << cnt + 1 << "!"; }else { //找到一个以上cout << "Warning: please check all the tires!";}
}

L1-6 吃火锅 (15分)


以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。

输入格式:
输入每行给出一句不超过 80 个字符的、以回车结尾的朋友信息,信息为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。当读到某一行只有一个英文句点 . 时,输入结束,此行不算在朋友信息里。

输出格式:
首先在一行中输出朋友信息的总条数。然后对朋友的每一行信息,检查其中是否包含 chi1 huo3 guo1,并且统计这样厉害的信息有多少条。在第二行中首先输出第一次出现 chi1 huo3 guo1 的信息是第几条(从 1 开始计数),然后输出这类信息的总条数,其间以一个空格分隔。题目保证输出的所有数字不超过 100。

如果朋友从头到尾都没提 chi1 huo3 guo1 这个关键词,则在第二行输出一个表情 -_-#。

输入样例 1:

Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.

输出样例 1:

5
3 2

输入样例 2:

Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.

输出样例 2:

5
-_-#

思路:
while() + getline()输入带空格的字符串,遇到“.”结束
在每个字符串里面找chi1 huo3 guo1,统计一共出现次数 和 第一个出现位置。

ans:

#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;int main() {string str;int ii = 0; //记录当前位置(当前这一句是第几句) bool fi = 0; //有没有第一次出现吃火锅关键字 int fir; //第一句关键字出现位置 int all = 0; //一共几句有关键字 while(getline(cin, str)) {if(str == ".") {break;}ii++;if(str.find("chi1 huo3 guo1") != string :: npos) { //找到关键字了all++;if(fi == 0) { //是第一句带关键字的,记录位置fi = 1;fir = ii;}}}cout << ii << endl;if(all) {cout << fir << " " << all;    }else {cout << "-_-#";}return 0;
}

L1-7 前世档案 (20分)

网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终点对应的那个结点。

现在我们把结论从左到右顺序编号,编号从 1 开始。这里假设回答都是简单的“是”或“否”,又假设回答“是”对应向左的路径,回答“否”对应向右的路径。给定玩家的一系列回答,请你返回其得到的结论的编号。

输入格式:
输入第一行给出两个正整数:N(≤30)为玩家做一次测试要回答的问题数量;M(≤100)为玩家人数。

随后 M 行,每行顺次给出玩家的 N 个回答。这里用 y 代表“是”,用 n 代表“否”。

输出格式:
对每个玩家,在一行中输出其对应的结论的编号。

输入样例:

3 4
yny
nyy
nyn
yyn

输出样例:

3
5
6
2

ans:

两种方法

  1. 二分:
#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;int main() {int n, m;cin >> n >> m;while(m --) {int f;string str;cin >> str;int len = str.length();int t = (1 << len); //可能性的总个数 int l = 1, r = t;for (int i = 0; i < len; i ++) {if(str[i] == 'y') { //肯定答案,沿树枝方向相左走,右边被排除一半 r -= (r - l) / 2;r --;}else { //否定答案,沿树枝方向向右走,左边被排除一半 l += (r - l) / 2;l ++;}}//       cout << l << endl; 此时 l 与 r相等,输出什么都行 cout << r << endl; }return 0;
}
  1. 直接计算:从下往上走
#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;int main() {int n, m;cin >> n >> m;int k = (int)pow(2, n);for(int i = 0; i < m; i ++) {string ss;cin >> ss;int t = 0;for(int j = n - 1; j >= 0; j --) {if(ss[j] == 'y') {t += (int) pow(2, (n - j - 1));}}cout << k - t << endl;} return 0;
}

L1-8 刮刮彩票 (20分)

“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示:

每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。

在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 3 横、3 竖、2 斜共 8 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。

现在请你写出一个模拟程序,模拟玩家的游戏过程。

输入格式:
输入第一部分给出一张合法的彩票,即用 3 行 3 列给出 0 至 9 的数字。0 表示的是这个位置上的数字初始时就能看见了,而不是彩票上的数字为 0。

第二部给出玩家刮开的三个位置,分为三行,每行按格式 x y 给出玩家刮开的位置的行号和列号(题目中定义左上角的位置为第 1 行、第 1 列。)。数据保证玩家不会重复刮开已刮开的数字。

最后一部分给出玩家选择的方向,即一个整数: 1 至 3 表示选择横向的第一行、第二行、第三行,4 至 6 表示纵向的第一列、第二列、第三列,7、8分别表示左上到右下的主对角线和右上到左下的副对角线。

输出格式:
对于每一个刮开的操作,在一行中输出玩家能看到的数字。最后对于选择的方向,在一行中输出玩家获得的金币数量。

输入样例:

1 2 3
4 5 6
7 8 0
1 1
2 2
2 3
7

输出样例:

1
5
6
180

14分ans:

#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;int a[4][4];
bool v[4][4];int main() {int tt = 0;for (int i = 1; i <= 3; i ++) {for (int j = 1; j <= 3; j ++) {cin >> a[i][j];tt += a[i][j];}}for (int i = 1; i <= 3; i ++) {for (int j = 1; j <= 3; j ++) {if(a[i][j] == 0) {v[i][j] = 1;a[i][j] = 45 - tt;}}}for (int i = 0; i < 3; i++) {int x, y;cin >> x >> y;cout << a[x][y] << endl;v[x][y] = 1;}int ans = 0;int f;cin >> f;if(f == 1) {for (int i = 1; i <= 3; i ++) {if(v[1][i]) {ans += a[1][i];continue;}}}if(f == 2) {for (int i = 1; i <= 3; i ++) {if(v[2][i]) {ans += a[2][i];continue;}}}if(f == 3) {for (int i = 1; i <= 3; i ++) {if(v[3][i]) {ans += a[3][i];continue;}}}if(f == 4) {for (int i = 1; i <= 3; i ++) {if(v[i][1]) {ans += a[i][1];continue;}}}if(f == 5) {for (int i = 1; i <= 3; i ++) {if(v[i][2]) {ans += a[i][2];continue;}}}if(f == 6) {for (int i = 1; i <= 3; i ++) {if(v[i][3]) {ans += a[i][3];continue;}}}if(f == 7) {for (int i = 1; i <= 3; i ++) {if(v[i][i]) {ans += a[i][i];continue;}}}if(f == 8) {for (int i = 1; i <= 3; i ++) {if(v[3 - i + 1][3 - i + 1]) {ans += v[3 - i + 1][3 - i + 1];continue;}}}int haha[25] = {0, 0, 0, 0, 0, 0, 10000, 36, 720, 360, 80, 252, 108, 72, 54, 180, 72, 180, 119, 36, 306, 1080, 144, 1800, 3600};cout << haha[ans];return 0;
}

L2-1 简单计算器 (25分)

本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:

  1. 从 S1中弹出两个数字,顺序为 n1和 n2;
  2. 从 S2中弹出一个运算符 op;
  3. 执行计算 n​2 op n1;
  4. 将得到的结果压回 S1​​ 。

直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。

输入格式:
输入首先在第一行给出正整数 N(1<N≤10^​3​​),为 S1中数字的个数。

第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +、-、*、/ 这四种运算。一行中的数字和符号都以空格分隔。

输出格式:
将输入的数字和运算符按给定顺序分别压入堆栈 S1和 S2,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 10^9。

如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。
输入样例 1:

5
40 5 8 3 2
/ * - +

输出样例 1:

2

输入样例 2:

5
2 5 8 4 4
* / - +

输出样例 2:

ERROR: 5/0

考点:stack的应用

ans:

#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;stack<int> st;
stack<char> sk;int main() {int n;cin >> n;for(int i = 0; i < n; i ++) {int t;cin >> t;st.push(t);}for(int i = 0; i < n - 1; i ++) {char t;cin >> t;sk.push(t);}while(!sk.empty()) {int x, y;x = st.top(); st.pop();y = st.top(); st.pop();char op = sk.top(); sk.pop();if(op == '+') st.push(y + x); if(op == '-') st.push(y - x);if(op == '*') st.push(y * x);if(op == '/') {if(x == 0) {return cout << "ERROR: " << y << "/0", 0;}st.push(y / x);}}cout << st.top();return 0;
}

L2-2 口罩发放 (25分)

为了抗击来势汹汹的 COVID19 新型冠状病毒,全国各地均启动了各项措施控制疫情发展,其中一个重要的环节是口罩的发放。

某市出于给市民发放口罩的需要,推出了一款小程序让市民填写信息,方便工作的开展。小程序收集了各种信息,包括市民的姓名、身份证、身体情况、提交时间等,但因为数据量太大,需要根据一定规则进行筛选和处理,请你编写程序,按照给定规则输出口罩的寄送名单。

输入格式:
输入第一行是两个正整数 D 和 P(1≤D,P≤30),表示有 D 天的数据,市民两次获得口罩的时间至少需要间隔 P 天。

接下来 D 块数据,每块给出一天的申请信息。第 i 块数据(i=1,⋯,D)的第一行是两个整数 T​i和 Si(1≤T​i ,Si≤1000),表示在第 i 天有 Ti条申请,总共有 Si个口罩发放名额。随后 Ti行,每行给出一条申请信息,格式如下:姓名 身份证号 身体情况 提交时间

给定数据约束如下:

  • 姓名 是一个长度不超过 10 的不包含空格的非空字符串;
  • 身份证号 是一个长度不超过 20 的非空字符串;
  • 身体情况 是 0 或者 1,0 表示自觉良好,1 表示有相关症状;
  • 提交时间 是 hh:mm,为24小时时间(由 00:00 到 23:59。例如 09:08。)。注意,给定的记录的提交时间不一定有序;
  • 身份证号 各不相同,同一个身份证号被认为是同一个人,数据保证同一个身份证号姓名是相同的。
    能发放口罩的记录要求如下:
  • 身份证号 必须是 18 位的数字(可以包含前导0);
  • 同一个身份证号若在第 i 天申请成功,则接下来的 P 天不能再次申请。也就是说,若第 i 天申请成功,则等到第 i+P+1 天才能再次申请;
  • 在上面两条都符合的情况下,按照提交时间的先后顺序发放,直至全部记录处理完毕或 S​i个名额用完。如果提交时间相同,则按照在列表中出现的先后顺序决定。

输出格式:
对于每一天的申请记录,每行输出一位得到口罩的人的姓名及身份证号,用一个空格隔开。顺序按照发放顺序确定。
在输出完发放记录后,你还需要输出有合法记录的、身体状况为 1 的申请人的姓名及身份证号,用空格隔开。顺序按照申请记录中出现的顺序确定,同一个人只需要输出一次。

输入样例:

4 2
5 3
A 123456789012345670 1 13:58
B 123456789012345671 0 13:58
C 12345678901234567 0 13:22
D 123456789012345672 0 03:24
C 123456789012345673 0 13:59
4 3
A 123456789012345670 1 13:58
E 123456789012345674 0 13:59
C 123456789012345673 0 13:59
F F 0 14:00
1 3
E 123456789012345674 1 13:58
1 1
A 123456789012345670 0 14:11

输出样例:

D 123456789012345672
A 123456789012345670
B 123456789012345671
E 123456789012345674
C 123456789012345673
A 123456789012345670
A 123456789012345670
E 123456789012345674

样例解释:
输出中,第一行到第三行是第一天的部分;第四、五行是第二天的部分;第三天没有符合要求的市民;第六行是第四天的部分。最后两行按照出现顺序输出了可能存在身体不适的人员。

20分ans:

#include<bits/stdc++.h>
#include<map>
#define N 100000
using namespace std;
struct Node {string name;string id;int flag;int hh,mm;int t;
} a[N],ans[N];int d,p;
int t,s;
int anscnt;map<string, int> mp;
map<string, int> vis;bool cmp(Node x,Node y) {return x.t < y.t;
}int main() {scanf("%d%d",&d,&p);for(int i=1; i<=d; i++) {scanf("%d%d",&t,&s);for(int j=1; j<=t; j++) {cin >> a[j].name >> a[j].id;scanf("%d%d:%d",&a[j].flag,&a[j].hh,&a[j].mm);a[j].t = a[j].hh*60 + a[j].mm;if(mp.find(a[j].id) == mp.end()) {mp[a[j].id] = 0;}if(a[j].flag == 1 && vis.find(a[j].id) == vis.end()) {vis[a[j].id] = 0;ans[anscnt++] = a[j];}}sort(a+1,a+t+1,cmp);int cnt = 0;for(int j=1; j<=t && cnt<s; j++) {if(a[j].id.length() == 18 && (!mp[a[j].id] || (i-mp[a[j].id])>p)) {cout << a[j].name << " " << a[j].id << endl;cnt++;mp[a[j].id] = i;}}}for(int i=0; i<anscnt; ++i) {cout << ans[i].name << " " << ans[i].id << endl;}return 0;
}

L2-3 完全二叉树的层序遍历 (25分)

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。

给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。

输入格式:
输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。

输出格式:
在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

8
91 71 2 34 10 15 55 18

输出样例:

18 34 55 71 2 10 15 91

ans:

#include <bits/stdc++.h>
using namespace std;int wan, s, n;
int A[50];
int DFS[50];
int cnt = 0;void dfs(int root, int level) {if (level > wan)return;dfs(root * 2, level + 1);dfs(root * 2 + 1, level + 1);if (root <= n) {DFS[root] = A[++cnt];}
}int main() {ios::sync_with_stdio(false);cin.tie(0);cin >> n;for (int i = 1; i <= n; ++i) {cin >> A[i];}if (n == 1) {wan = 1;s = 1;}else if (n <= 3) {wan = 2;s = 3;}else if (n <= 7) {wan = 3;s = 7;}else if (n <= 15) {wan = 4;s = 15;}else if (n <= 31) {wan = 5;s = 31;}dfs(1, 1);for (int i = 1; i <= n; ++i) {if (i != 1)cout << ' ';cout << DFS[i];}return 0;
}

L2-4 网红点打卡攻略 (25分)

一个旅游景点,如果被带火了的话,就被称为“网红点”。大家来网红点游玩,俗称“打卡”。在各个网红点打卡的快(省)乐(钱)方法称为“攻略”。你的任务就是从一大堆攻略中,找出那个能在每个网红点打卡仅一次、并且路上花费最少的攻略。

输入格式:
首先第一行给出两个正整数:网红点的个数 N(1<N≤200)和网红点之间通路的条数 M。随后 M 行,每行给出有通路的两个网红点、以及这条路上的旅行花费(为正整数),格式为“网红点1 网红点2 费用”,其中网红点从 1 到 N 编号;同时也给出你家到某些网红点的花费,格式相同,其中你家的编号固定为 0。
再下一行给出一个正整数 K,是待检验的攻略的数量。随后 K 行,每行给出一条待检攻略,格式为:

n  V1  V2 ⋯ Vn

​​
其中 n(≤200) 是攻略中的网红点数,Vi是路径上的网红点编号。这里假设你从家里出发,从 V1开始打卡,最后从 Vn回家。

输出格式:
在第一行输出满足要求的攻略的个数。

在第二行中,首先输出那个能在每个网红点打卡仅一次、并且路上花费最少的攻略的序号(从 1 开始),然后输出这个攻略的总路费,其间以一个空格分隔。如果这样的攻略不唯一,则输出序号最小的那个。

题目保证至少存在一个有效攻略,并且总路费不超过 10^​9。

输入样例:

6 13
0 5 2
6 2 2
6 0 1
3 4 2
1 5 2
2 5 1
3 1 1
4 1 2
1 6 1
6 3 2
1 2 1
4 5 3
2 0 2
7
6 5 1 4 3 6 2
6 5 2 1 6 3 4
8 6 2 1 6 3 4 5 2
3 2 1 5
6 6 1 3 4 5 2
7 6 2 1 3 4 5 2
6 5 2 1 4 3 6

输出样例:

3
5 11

样例说明:
第 2、3、4、6 条都不满足攻略的基本要求,即不能做到从家里出发,在每个网红点打卡仅一次,且能回到家里。所以满足条件的攻略有 3 条。

第 1 条攻略的总路费是:(0->5) 2 + (5->1) 2 + (1->4) 2 + (4->3) 2 + (3->6) 2 + (6->2) 2 + (2->0) 2 = 14;

第 5 条攻略的总路费同理可算得:1 + 1 + 1 + 2 + 3 + 1 + 2 = 11,是一条更省钱的攻略;

第 7 条攻略的总路费同理可算得:2 + 1 + 1 + 2 + 2 + 2 + 1 = 11,与第 5 条花费相同,但序号较大,所以不输出。

ans:

#include <bits/stdc++.h>
using namespace std;int n, m, k;
int vis[205];
int E[205][205];
int ans = 2e9, id, cnt;int main() {ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 0; i < m; ++i) {int u, v, w;cin >> u >> v >> w;E[u][v] = E[v][u] = w;}cin >> k;for (int i = 1; i <= k; ++i) {int N;cin >> N;memset(vis, 0, sizeof(vis));int sum = 0, f = 0, last = 0;for (int j = 0; j < N; ++j) {int t;cin >> t;if (vis[t]) {f = 1;}if (E[last][t] == 0) f = 1;sum += E[last][t];vis[t] = 1;last = t;}if (E[last][0] == 0 || N != n) f = 1;sum += E[last][0];if (f) continue;++cnt;if (sum < ans) {id = i;ans = sum;}}cout << cnt << '\n' << id << ' ' << ans;return 0;
}

L3-1 那就别担心了 (30分)

下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。

博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?”到“那就别担心了”就是一种“逻辑自洽”的推理,一共有 3 条不同的推理路径。

输入格式:
输入首先在一行中给出两个正整数 N(1<N≤500)和 M,分别为命题个数和推理个数。这里我们假设命题从 1 到 N 编号。

接下来 M 行,每行给出一对命题之间的推理关系,即两个命题的编号 S1 S2,表示可以从 S1 推出 S2。题目保证任意两命题之间只存在最多一种推理关系,且任一命题不能循环自证(即从该命题出发推出该命题自己)。

最后一行给出待检验的两个命题的编号 A B。

输出格式:
在一行中首先输出从 A 到 B 有多少种不同的推理路径,然后输出 Yes 如果推理是“逻辑自洽”的,或 No 如果不是。

题目保证输出数据不超过 10^​9。

输入样例 1:

7 8
7 6
7 4
6 5
4 1
5 2
5 3
2 1
3 1
7 1

输出样例 1:

3 Yes

输入样例 2:

7 8
7 6
7 4
6 5
4 1
5 2
5 3
6 1
3 1
7 1

输出样例 2:

3 No

无题解

L3-2 传送门 (30分)


输入样例:

5 4
+ 1 3 1
+ 1 4 3
+ 2 5 2
- 1 4 3

输出样例:

51
48
39
42

样例解释:
修改 | f(1) | f(2) | f(3) | f(4) | f(5) | 结果 — | — + 1 3 1 | 3 | 2 | 1 | 4 | 5 | 51 + 1 4 3 | 3 | 2 | 4 | 1 | 5 | 48 + 2 5 2 | 3 | 5 | 4 | 1 | 2 | 39 - 1 4 3 | 3 | 5 | 1 | 4 | 2 | 42

无题解

L3-3 可怜的复杂度 (30分)


输入样例:

4
3 2
1 1 1
3 2
1 2 1
5 2
1 2 1 2 1
10 2
80582987 187267045 80582987 187267045 80582987 187267045 80582987 187267045 80582987 187267045

输出样例:

36
44
404
44616

无题解

♥如有谬误还请指正~~蟹蟹♥

2020年11月28日天梯赛GPLT总决赛(全部题目 + 189分代码答案)相关推荐

  1. 2020年11月28日

    leetcode刷题记录 剑指offer 50. 第一次只出现一次的字符 思路 用一个结构体保存值和val,然后进行排序,简单题就不多说了 代码 typedef struct valandindex{ ...

  2. 邮箱无权访问 上的 jira是怎么回事_蚂蚁庄园答案2020年11月6日汇总 小鸡宝宝考考你每日答案为你呈上|蚂蚁|庄园-360GAME...

    川北在线核心提示:原标题: 蚂蚁庄园答案2020年11月6日汇总 小鸡宝宝考考你每日答案为你呈上 支付宝蚂蚁庄园小课堂11月6日答案是什么呢?2020年11月6日支付宝蚂蚁庄园小课堂题目是健身过后什么 ...

  3. 【财经期刊FM-Radio|2020年11月03日】

    title: [财经期刊FM-Radio|2020年11月03日] 微信公众号: 张良信息咨询服务工作室 [今日热点新闻一览↓↓] 道指涨超400点,科技股拖累纳指一度转跌,蔚来再创新高,油价自日低反 ...

  4. 6 日期字符串转日期_山西省导游协会关于发放电子导游证的通知 (生成日期为2020年5月28日2020年6月3日)...

    各位会员.导游同仁们:山西省导游协会电子导游证(生成日期为:2020年5月28日-2020年6月3日)已制作完成,为保障电子导游证发放工作顺利进行,现将发放电子导游证有关事项通知如下:一.领取人员手机 ...

  5. 【财经期刊FM-Radio|2020年11月14日】

    title: [财经期刊FM-Radio|2020年11月14日] 微信公众号: 张良信息咨询服务工作室 [今日热点新闻一览↓↓] 能源股创最大周涨幅,欧美股市反弹连涨两周,中概新能源车盘中大逆转跌落 ...

  6. 【财经期刊FM-Radio|2020年11月24日】

    title: [财经期刊FM-Radio|2020年11月24日] 微信公众号: 张良信息咨询服务工作室 [今日热点新闻一览↓↓] 美股走出一周低谷,布油创八个月新高,金银大跌,苹果跌近3%,特斯拉和 ...

  7. 【财经期刊FM-Radio|2020年11月25日】

    title: [财经期刊FM-Radio|2020年11月25日] 微信公众号: 张良信息咨询服务工作室 [今日热点新闻一览↓↓] 道指首次升破3万点,原油比特币高涨,金银再跌,特斯拉盘中市值突破50 ...

  8. 1128d_日式迷宫探索DRPG《灵魂潮汐》预计11月28日开测

    提到RPG,相信小伙伴们一定不陌生,这一古老的游戏类型在游戏历史长河中历经风雨后经久不衰,至今仍然是很多玩家的最爱,甚至有些小伙伴还能一口气说出不少款自己心中最佳的RPG游戏. 但是若说到其子类型DR ...

  9. 2020年10月28日普级组总结

    2020 年 10 月 28 日 普 级 组 2020年10月28日普级组 2020年10月28日普级组 今天又是打了场模拟赛,做的不怎么理想. 成绩 : 由于数据水,所以还是乱搞搞了个302分:而陈 ...

最新文章

  1. Linux通过端口号杀死指定进程
  2. VS 2005 Debugger crashing with IE 8
  3. linux下 chown命令
  4. centos 6.5配置samba
  5. reactjs组件的props属性及其特点
  6. 【sklearn学习】随机森林分类、回归
  7. 如何创建Java程序
  8. 神经网络中BP(back propagation)到底在干些什么
  9. 信息安全工程师笔记-综合知识冲刺(一)
  10. (29)System Verilog进程间同步(旗语semaphore)
  11. php solr 全文检索,全文检索可视化动态管理(二)--solr二次开发和solrj扩展
  12. Java语言程序设计基础篇第10版第5章习题答案
  13. 人体运动生物力学之人体步态分析
  14. java运维工程师简历模板_系统运维工程师个人个人简历模板.doc
  15. afc系统线路中心计算机系统,青岛地铁线网AFC系统建设探讨
  16. windows下仿Mac Dock软件MultiDock
  17. 费解的开关(模拟/BFS+二进制)
  18. 微信PC端技术研究(2)-拿下语音
  19. taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,淘宝R2接口,淘宝oAuth2.0交易接口代码分享
  20. 操作系统实验Ucore:Kernel_init(四)

热门文章

  1. 如何把软件卸载得更彻底
  2. 机械设计手册2[1].0的关于要插盘的问题的解密文件
  3. 关于Group By 单个和多个字段
  4. oracle 郑阿奇 pdf,Delphi编程教程 (郑阿奇) PDF扫描版
  5. 品牌连锁企业如何突破技术壁垒对接分账系统?
  6. 阿拉丁统计 2.0丨开源 SDK 生态,既能开箱即用,又能自定义扩展,让你的企业数字化进程“兔飞猛进”
  7. layui,始终打开最后一页
  8. 让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
  9. Android抓包Charles入门教程
  10. echarts 导入地区.json文件生成地图