2021年中国高校计算机大赛团体程序设计天梯赛

  • L1-1 人与神 (5 分)
  • L1-2 两小时学完C语言 (5 分)
  • L1-3 强迫症 (10 分)
  • L1-4 降价提醒机器人 (10 分)
  • L1-5 大笨钟的心情 (15 分)
  • L1-6 吉老师的回归 (15 分)
  • L1-7 天梯赛的善良 (20 分)
  • L1-8 乘法口诀数列 (20 分)
  • L2-1 包装机 (25 分)
  • L2-2 病毒溯源 (25 分)
  • L2-3 清点代码库 (25 分)
  • L2-4 哲哲打游戏 (25 分)
  • L3-1 森森旅游 (30 分)
  • L3-2 还原文件 (30 分)
  • L3-3 可怜的简单题 (30 分)

L3-1 森森旅游 暴力骗分的。。18分 真暴力
L3-3 可怜的简单题 看不懂 输出1骗1分哈哈

有时间再写解题思路,,,有几题写过在我的文章里,大家可以看看

L1-1 人与神 (5 分)

跨界大神 L. Peter Deutsch 有一句名言:“To iterate is human, to recurse divine.”(迭代的是人,递归的是神)。本题就请你直接在屏幕上输出这句话。

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

输出格式:
在一行中输出 To iterate is human, to recurse divine.。

输入样例:

输出样例:

To iterate is human, to recurse divine.

代码:

print("To iterate is human, to recurse divine.")

L1-2 两小时学完C语言 (5 分)


知乎上有个宝宝问:“两个小时内如何学完 C 语言?”当然,问的是“学完”并不是“学会”。

假设一本 C 语言教科书有 N 个字,这个宝宝每分钟能看 K 个字,看了 M 分钟。还剩多少字没有看?

输入格式:
输入在一行中给出 3 个正整数,分别是 N(不超过 400 000),教科书的总字数;K(不超过 3 000),是宝宝每分钟能看的字数;M(不超过 120),是宝宝看书的分钟数。

题目保证宝宝看完的字数不超过 N。

输出格式:
在一行中输出宝宝还没有看的字数。

输入样例:

100000 1000 72

输出样例:

28000

代码:

#include <iostream>
#include<stdio.h>
using namespace std;int main()
{int n,k,m;cin>>n>>k>>m;int sum=k*m;if(sum>=n)cout<<0;elsecout<<n-sum;
}

L1-3 强迫症 (10 分)

小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。

输入格式:
输入在一行中给出一个出生年月,为一个 6 位或者 4 位数,题目保证是 1000 年 1 月到 2021 年 12 月之间的合法年月。

输出格式:
在一行中按标准格式 年年年年-月月 将输入的信息整理输出。

输入样例 1:

9808

输出样例 1:

1998-08

输入样例 2:

0510

输出样例 2:

2005-10

输入样例 3:

196711

输出样例 3:

1967-11

代码:

#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{int n;cin>>n;if(n>9999)///六位数{printf("%d-%02d",n/100,n%100);}else///四位数{if(n/100<22)printf("20%02d-%02d",n/100,n%100);else printf("19%02d-%02d",n/100,n%100);}
}

L1-4 降价提醒机器人 (10 分)

小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。

输入格式:
输入第一行是两个正整数 N 和 M (1≤N≤100,0≤M≤1000),表示有 N 条价格记录,小 T 设置的价格为 M。

接下来 N 行,每行有一个实数 P i(−1000.0<P i <1000.0),表示一条价格记录。
输出格式:
对每一条比设定价格 M 便宜的价格记录 P,在一行中输出 On Sale! P,其中 P 输出到小数点后 1 位。

输入样例:

4 99
98.0
97.0
100.2
98.9

输出样例:

On Sale! 98.0

On Sale! 97.0

On Sale! 98.9

代码:

#include <iostream>
#include<stdio.h>
using namespace std;int main()
{double n,temp,x;cin>>n>>temp;for(int i=0;i<n;i++){cin>>x;if(x<temp)printf("On Sale! %.1lf\n",x);}return 0;
}

L1-5 大笨钟的心情 (15 分)


有网友问:未来还会有更多大笨钟题吗?笨钟回复说:看心情……

本题就请你替大笨钟写一个程序,根据心情自动输出回答。

输入格式:
输入在一行中给出 24 个 [0, 100] 区间内的整数,依次代表大笨钟在一天 24 小时中,每个小时的心情指数。

随后若干行,每行给出一个 [0, 23] 之间的整数,代表网友询问笨钟这个问题的时间点。当出现非法的时间点时,表示输入结束,这个非法输入不要处理。题目保证至少有 1 次询问。

输出格式:
对每一次提问,如果当时笨钟的心情指数大于 50,就在一行中输出 心情指数 Yes,否则输出 心情指数 No。

输入样例:

80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1

输出样例:

52 Yes
20 No
50 No
58 Yes

代码:

#include <iostream>
using namespace std;
int main()
{int a[24];for(int i=0;i<24;i++)cin>>a[i];int x;cin>>x;while(x>=0&&x<=23){if(a[x]>50)cout<<a[x]<<" Yes\n";elsecout<<a[x]<<" No\n";cin>>x;}return 0;
}

L1-6 吉老师的回归 (15 分)

曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦!

为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的字符串描述出来,如:Problem A: Print “Hello world!”。

众所周知,吉老师的竞赛水平非常高超,你可以认为他每道题目都会做(事实上也是……)。因此,吉老师会按照顺序看题并做题。但吉老师水平太高了,所以签到题他就懒得做了(浪费时间),具体来说,假如题目的字符串里有 qiandao 或者 easy(区分大小写)的话,吉老师看完题目就会跳过这道题目不做。

现在给定这次天梯赛总共有几道题目以及吉老师已经做完了几道题目,请你告诉大家吉老师现在正在做哪个题,或者吉老师已经把所有他打算做的题目做完了。

提醒:天梯赛有分数升级的规则,如果不做签到题可能导致团队总分不足以升级,一般的选手请千万不要学习吉老师的酷炫行为!

输入格式:
输入第一行是两个正整数 N,M (1≤M≤N≤30),表示本次天梯赛有 N 道题目,吉老师现在做完了 M 道。

接下来 N 行,每行是一个符合题目描述的字符串,表示天梯赛的题目内容。吉老师会按照给出的顺序看题——第一行就是吉老师看的第一道题,第二行就是第二道,以此类推。

输出格式:
在一行中输出吉老师当前正在做的题目对应的题面(即做完了 M 道题目后,吉老师正在做哪个题)。如果吉老师已经把所有他打算做的题目做完了,输出一行 Wo AK le。

输入样例 1:

5 1
L1-1 is a qiandao problem.
L1-2 is so…easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so easy.

输出样例 1:

L1-4 is qianDao.

输入样例 2:

5 4
L1-1 is a-qiandao problem.
L1-2 is so easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so!!easy.

输出样例 2:

Wo AK le

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{int n,m;cin>>n>>m;string s[35];getchar();for(int i=0; i<n; i++)getline(cin,s[i]);int flag=0,temp=0;for(int i=0; i<n; i++){if(s[i].find("qiandao")==-1&&s[i].find("easy")==-1){flag++;if(flag>m){cout<<s[i];temp++;break;}}}if(temp==0)cout<<"Wo AK le";return 0;
}

L1-7 天梯赛的善良 (20 分)

天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。

于是命题组首先将编程能力划分成了 10 6个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。

输入格式:
输入在第一行中给出一个正整数 N(≤2×10 4),即参赛学生的总数。随后一行给出 N 个不超过 10 6的正整数,是参赛学生的能力值。

输出格式:
第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10
86 75 233 888 666 75 886 888 75 666

输出样例:

75 3
888 2

代码:

#include <iostream>
#include<stdio.h>
using namespace std;
int a[100000];
int main()
{int n,x,maxx=-99999,minn=99999,maxtimes=0,mintimes=0;cin>>n;for(int i=0;i<n;i++){cin>>x;if(x>=maxx){if(x==maxx)maxtimes++;else{maxtimes=1;maxx=x;}}if(x<=minn){if(x==minn)mintimes++;else{mintimes=1;minn=x;}}}cout<<minn<<' '<<mintimes<<endl<<maxx<<' '<<maxtimes<<endl;
}

L1-8 乘法口诀数列 (20 分)

本题要求你从任意给定的两个 1 位数字 a 1和 a 2开始,用乘法口诀生成一个数列 {a n },规则为从 a 1开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。

输入格式:
输入在一行中给出 3 个整数,依次为 a 1 、a 2和 n,满足 0≤a 1,a 2≤9,0<n≤10 3。

输出格式:
在一行中输出数列的前 n 项。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

2 3 10

输出样例:

2 3 6 1 8 6 8 4 8 4

样例解释:
数列前 2 项为 2 和 3。从 2 开始,因为 2×3=6,所以第 3 项是 6。因为 3×6=18,所以第 4、5 项分别是 1、8。依次类推…… 最后因为第 6 项有 6×8=48,对应第 10、11 项应该是 4、8。而因为只要求输出前 10 项,所以在输出 4 后结束。

代码:

#include <iostream>
using namespace std;int main()
{int x,y,n,now=2,last=3;cin>>x>>y>>n;int a[n+1];a[1]=x,a[2]=y;while(last<=n){x=a[now]*a[now-1];if(x>=10){y=x%10;x=x/10;a[last++]=x;a[last++]=y;}elsea[last++]=x;now++;}cout<<a[1];for(int i=2;i<=n;i++)cout<<' '<<a[i];return 0;
}

L2-1 包装机 (25 分)

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品,放到流水线上。图 2 显示了顺序按下按钮 3、2、3、0、1、2、0 后包装机的状态。

图1 自动包装机的结构

图 2 顺序按下按钮 3、2、3、0、1、2、0 后包装机的状态

一种特殊情况是,因为筐的容量是有限的,当筐已经满了,但仍然有某条轨道的按钮被按下时,系统应强制启动 0 号键,先从筐里抓出一件物品,再将对应轨道的物品推落。此外,如果轨道已经空了,再按对应的按钮不会发生任何事;同样的,如果筐是空的,按 0 号按钮也不会发生任何事。

现给定一系列按钮操作,请你依次列出流水线上的物品。

输入格式:
输入第一行给出 3 个正整数 N(≤100)、M(≤1000)和 S max(≤100),分别为轨道的条数(于是轨道从 1 到 N 编号)、每条轨道初始放置的物品数量、以及筐的最大容量。随后 N 行,每行给出 M 个英文大写字母,表示每条轨道的初始物品摆放。

最后一行给出一系列数字,顺序对应被按下的按钮编号,直到 −1 标志输入结束,这个数字不要处理。数字间以空格分隔。题目保证至少会取出一件物品放在流水线上。

输出格式:
在一行中顺序输出流水线上的物品,不得有任何空格。

输入样例:

3 4 4
GPLT
PATA
OMSA
3 2 3 0 1 2 0 2 2 0 -1

输出样例:

MATA

代码:

#include <iostream>
#include<stack>
using namespace std;int n,m,s;///轨道的条数\物品数量\筐的最大容量
int a[110][1100];///阿斯克码存放
int leng[110];
stack <int>st;
int main()
{cin>>n>>m>>s;char x;for(int i=1; i<=n; i++){for(int j=0; j<m; j++){cin>>x;a[i][j]=(int)x;}}int y,temp;cin>>y;while(y!=-1){if(y!=0){if(leng[y]!=m)///轨道未空时{if(st.size()==s)///栈满时,先出栈 再入栈{cout<<(char)st.top();st.pop();}st.push(a[y][leng[y]++]);}}else{if(!st.empty()) ///栈不为空时{cout<<(char)st.top();st.pop();}}cin>>y;}return 0;
}

L2-2 病毒溯源 (25 分)


病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。

现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。

在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。

输入格式:
输入在第一行中给出一个正整数 N(≤10 4),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。
随后 N 行,每行按以下格式描述一种病毒的变异情况:k 变异株1 …… 变异株k其中 k 是该病毒产生的变异毒株的种类数,后面跟着每种变异株的编号。第 i 行对应编号为 i 的病毒(0≤i<N)。题目保证病毒源头有且仅有一个。

输出格式:
首先输出从源头开始最长变异链的长度。

在第二行中输出从源头开始最长的一条变异链,编号间以 1 个空格分隔,行首尾不得有多余空格。如果最长链不唯一,则输出最小序列。

注:我们称序列 { a 1,⋯,a n} 比序列 { b 1 ,⋯,b n } “小”,如果存在 1≤k≤n 满足 a i​=bi对所有 i<k 成立,且 a k<b k。

输入样例:

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

输出样例:

4
0 4 9 1

代码:

#include <iostream>
#include<vector>
using namespace std;
vector<int >a[10001],temproad,remroad;///a存储初始数据、temproad存储深搜过程的路径、remroad存储最佳路径
int n,maxdeep=-1,flag[10001],start;///maxdeep记录最大深度、flag数组为了找到初始病毒、start记录初始病毒的标号
void dfs(int x,int deep)
{if(deep>maxdeep){maxdeep=deep;remroad=temproad;}else if(deep==maxdeep&&temproad<remroad)  ///最小序列remroad=temproad;for(int i=0; i<a[x].size(); i++){temproad.push_back(a[x][i]);dfs(a[x][i],deep+1);temproad.pop_back();}return;
}
int main()
{int x,m;cin>>n;for(int i=0; i<n; i++){cin>>m;for(int j=0; j<m; j++){cin>>x;flag[x]=1;a[i].push_back(x);}}for(int i=0;i<n;i++)  ///重点是找初始病毒,由于每次给的都是子病毒,那么初始病毒不会给出,即falg为0的点就是初始病毒if(flag[i]==0)start=i;temproad.push_back(start);dfs(start,1);cout<<maxdeep<<endl<<remroad[0];for(int i=1; i<maxdeep; i++)cout<<' '<<remroad[i];return 0;
}

L2-3 清点代码库 (25 分)


上图转自新浪微博:“阿里代码库有几亿行代码,但其中有很多功能重复的代码,比如单单快排就被重写了几百遍。请设计一个程序,能够将代码库中所有功能重复的代码找出。各位大佬有啥想法,我当时就懵了,然后就挂了。。。”

这里我们把问题简化一下:首先假设两个功能模块如果接受同样的输入,总是给出同样的输出,则它们就是功能重复的;其次我们把每个模块的输出都简化为一个整数(在 int 范围内)。于是我们可以设计一系列输入,检查所有功能模块的对应输出,从而查出功能重复的代码。你的任务就是设计并实现这个简化问题的解决方案。

输入格式:
输入在第一行中给出 2 个正整数,依次为 N(≤10 4)和 M(≤10 2),对应功能模块的个数和系列测试输入的个数。

随后 N 行,每行给出一个功能模块的 M 个对应输出,数字间以空格分隔。

输出格式:
首先在第一行输出不同功能的个数 K。随后 K 行,每行给出具有这个功能的模块的个数,以及这个功能的对应输出。数字间以 1 个空格分隔,行首尾不得有多余空格。输出首先按模块个数非递增顺序,如果有并列,则按输出序列的递增序给出。

注:所谓数列 { A1, …, A M} 比 { B1 , …, B M} 大,是指存在 1≤i<M,使得 A1
​=B 1,…,A i=B i成立,且 A i+1>Bi+1。

输入样例:

7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74

输出样例:

4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35

代码:

#include <iostream>
#include<vector>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
struct node
{vector<int> arr;int repeat;
}a[11000];
int n,m,leng,x;
bool cmp(node q,node w)
{if(q.repeat==w.repeat)return q.arr<w.arr;return q.repeat>w.repeat;}
map<vector<int>,int>mp;
map<vector<int>,int>mp2;
int main()
{cin>>n>>m;for(int i=0;i<n;i++){vector<int>temp;temp.clear();for(int i=0;i<m;i++){int x;cin>>x;temp.push_back(x);}if(mp[temp]==0){mp2[temp]=leng;a[leng].repeat=1;a[leng++].arr=temp;mp[temp]++;}else{a[mp2[temp]].repeat++;}}sort(a,a+leng,cmp);cout<<leng<<endl;for(int i=0;i<leng;i++){cout<<a[i].repeat;for(int j=0;j<m;j++)cout<<' '<<a[i].arr[j];cout<<'\n';}return 0;
}

L2-4 哲哲打游戏 (25 分)

哲哲是一位硬核游戏玩家。最近一款名叫《达诺达诺》的新游戏刚刚上市,哲哲自然要快速攻略游戏,守护硬核游戏玩家的一切!

为简化模型,我们不妨假设游戏有 N 个剧情点,通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点。此外,游戏还设置了一些存档,在某个剧情点可以将玩家的游戏进度保存在一个档位上,读取存档后可以回到剧情点,重新进行操作或者选择,到达不同的剧情点。

为了追踪硬核游戏玩家哲哲的攻略进度,你打算写一个程序来完成这个工作。假设你已经知道了游戏的全部剧情点和流程,以及哲哲的游戏操作,请你输出哲哲的游戏进度。

输入格式:
输入第一行是两个正整数 N 和 M (1≤N,M≤10 5),表示总共有 N 个剧情点,哲哲有 M 个游戏操作。

接下来的 N 行,每行对应一个剧情点的发展设定。第 i 行的第一个数字是 Ki,表示剧情点 i 通过一些操作或选择能去往下面 K i个剧情点;接下来有 K i个数字,第 k 个数字表示做第 k 个操作或选择可以去往的剧情点编号。最后有 M 行,每行第一个数字是 0、1 或 2,分别表示:

0 表示哲哲做出了某个操作或选择,后面紧接着一个数字 j,表示哲哲在当前剧情点做出了第 j 个选择。我们保证哲哲的选择永远是合法的。
1 表示哲哲进行了一次存档,后面紧接着是一个数字 j,表示存档放在了第 j 个档位上。
2 表示哲哲进行了一次读取存档的操作,后面紧接着是一个数字 j,表示读取了放在第 j 个位置的存档。
约定:所有操作或选择以及剧情点编号都从 1 号开始。存档的档位不超过 100 个,编号也从 1 开始。游戏默认从 1 号剧情点开始。总的选项数(即 ∑K )不超过 10 6。

输出格式:
对于每个 1(即存档)操作,在一行中输出存档的剧情点编号。

最后一行输出哲哲最后到达的剧情点编号。

输入样例:

10 11
3 2 3 4
1 6
3 4 7 5
1 3
1 9
2 3 5
3 1 8 5
1 9
2 8 10
0
1 1
0 3
0 1
1 2
0 2
0 2
2 2
0 3
0 1
1 1
0 2

输出样例:

1
3
9
10

样例解释:
简单给出样例中经过的剧情点顺序:

1 -> 4 -> 3 -> 7 -> 8 -> 3 -> 5 -> 9 -> 10。

档位 1 开始存的是 1 号剧情点;档位 2 存的是 3 号剧情点;档位 1 后来又存了 9 号剧情点。

代码:

#include <iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int n,m,k,x,y;
vector<int >a[100100];
int rem[110];
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>k;for(int j=1;j<=k;j++){cin>>x;a[i].push_back(x);}}int nowway=1;for(int i=1;i<=m;i++){cin>>x>>y;if(x==1){rem[y]=nowway;cout<<nowway<<endl;}else if(x==2)nowway=rem[y];elsenowway=a[nowway][y-1];}cout<<nowway;return 0;
}

L3-1 森森旅游 (30 分)

好久没出去旅游啦!森森决定去 Z 省旅游一下。

Z 省有 n 座城市(从 1 到 n 编号)以及 m 条连接两座城市的有向旅行线路(例如自驾、长途汽车、火车、飞机、轮船等),每次经过一条旅行线路时都需要支付该线路的费用(但这个收费标准可能不止一种,例如车票跟机票一般不是一个价格)。

Z 省为了鼓励大家在省内多逛逛,推出了旅游金计划:在 i 号城市可以用 1 元现金兑换 a i元旅游金(只要现金足够,可以无限次兑换)。城市间的交通即可以使用现金支付路费,也可以用旅游金支付。具体来说,当通过第 j 条旅行线路时,可以用 c j元现金或 d j元旅游金支付路费。注意: 每次只能选择一种支付方式,不可同时使用现金和旅游金混合支付。但对于不同的线路,旅客可以自由选择不同的支付方式。

森森决定从 1 号城市出发,到 n 号城市去。他打算在出发前准备一些现金,并在途中的某个城市将剩余现金 全部 换成旅游金后继续旅游,直到到达 n 号城市为止。当然,他也可以选择在 1 号城市就兑换旅游金,或全部使用现金完成旅程。

Z 省政府会根据每个城市参与活动的情况调整汇率(即调整在某个城市 1 元现金能换多少旅游金)。现在你需要帮助森森计算一下,在每次调整之后最少需要携带多少现金才能完成他的旅程。

输入格式:
输入在第一行给出三个整数 n,m 与 q(1≤n≤10 5,1≤m≤2×10 5,1≤q≤10
5),依次表示城市的数量、旅行线路的数量以及汇率调整的次数。
接下来 m 行,每行给出四个整数 u,v,c 与 d(1≤u,v≤n,1≤c,d≤10 9),表示一条从 u 号城市通向 v 号城市的有向旅行线路。每次通过该线路需要支付 c 元现金或 d 元旅游金。数字间以空格分隔。输入保证从 1 号城市出发,一定可以通过若干条线路到达 n 号城市,但两城市间的旅行线路可能不止一条,对应不同的收费标准;也允许在城市内部游玩(即 u 和 v 相同)。

接下来的一行输入 n 个整数 a 1,a 2,⋯,a n(1≤a i≤10 9),其中 a i表示一开始在 i 号城市能用 1 元现金兑换 a i个旅游金。数字间以空格分隔。接下来 q 行描述汇率的调整。第 i 行输入两个整数 x i与 a i′(1≤x i≤n,1≤a i′≤10 9),表示第 i 次汇率调整后,x i号城市能用 1 元现金兑换 ai′个旅游金,而其它城市旅游金汇率不变。请注意:每次汇率调整都是在上一次汇率调整的基础上进行的。

输出格式:
对每一次汇率调整,在对应的一行中输出调整后森森至少需要准备多少现金,才能按他的计划从 1 号城市旅行到 n 号城市。

再次提醒:如果森森决定在途中的某个城市兑换旅游金,那么他必须将剩余现金全部、一次性兑换,剩下的旅途将完全使用旅游金支付。

输入样例:

6 11 3
1 2 3 5
1 3 8 4
2 4 4 6
3 1 8 6
1 3 10 8
2 3 2 8
3 4 5 3
3 5 10 7
3 3 2 3
4 6 10 12
5 6 10 6
3 4 5 2 5 100
1 2
2 1
1 17

输出样例:

8
8
1

样例解释:
对于第一次汇率调整,森森可以沿着 1→2→4→6 的线路旅行,并在 2 号城市兑换旅游金;

对于第二次汇率调整,森森可以沿着 1→2→3→4→6 的线路旅行,并在 3 号城市兑换旅游金;

对于第三次汇率调整,森森可以沿着 1→3→5→6 的线路旅行,并在 1 号城市兑换旅游金。

真.暴力骗分 18分。。
代码:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
long long  n,m,q;
vector<pair<int,long long> > cash[210000],travel[210000];///现金、旅游金
long long rate[210000],vis[210000];///初始汇率
double remmin=1999999999;///记录最小现金
void dfs(int x,double money,double sum)
{if(sum>remmin)///剪枝return;if(x==n-1){if(sum<remmin)remmin=sum;return;}for(int i=0;i<cash[x].size();i++){long long one=cash[x][i].first ,two=cash[x][i].second, three=travel[x][i].second;if(!vis[one]){vis[one]=1;if(money!=-1)///当已经兑换成旅游金时   加上旅游金{dfs(one,money,sum+three/(money*1.00));}else///当未兑换成旅游金时  当前城市x{dfs(one,rate[x],sum+three/(rate[x]*1.00));///兑换  加上旅游金dfs(one,money,sum+two);///不兑换   加上现金}vis[one]=0;}}
}
int main()
{cin>>n>>m>>q;for(int i=0;i<m;i++){long long u,v,c,d;cin>>u>>v>>c>>d;cash[u-1].push_back({v-1,c});travel[u-1].push_back({v-1,d});}for(int i=0;i<n;i++)cin>>rate[i];for(int i=0;i<q;i++){vis[0]=1;remmin=1999999999;long long u,v;cin>>u>>v;rate[u-1]=v;dfs(0,-1,0);cout<<ceil(remmin)<<endl;}return 0;
}

L3-2 还原文件 (30 分)

一份重要文件被撕成两半,其中一半还被送进了碎纸机。我们将碎纸机里找到的纸条进行编号,如图 1 所示。然后根据断口的折线形状跟没有切碎的半张纸进行匹配,最后还原成图 2 的样子。要求你输出还原后纸条的正确拼接顺序。

图1 纸条编号

图2 还原结果

输入格式:
输入首先在第一行中给出一个正整数 N(1<N≤10 5),为没有切碎的半张纸上断口折线角点的个数;随后一行给出从左到右 N 个折线角点的高度值(均为不超过 100 的非负整数)。

随后一行给出一个正整数 M(≤100),为碎纸机里的纸条数量。接下去有 M 行,其中第 i 行给出编号为 i(1≤i≤M)的纸条的断口信息,格式为:

K h[1] h[2] … h[K]
其中 K 是断口折线角点的个数(不超过 10 4+1),后面是从左到右 K 个折线角点的高度值。为简单起见,这个“高度”跟没有切碎的半张纸上断口折线角点的高度是一致的。

输出格式:
在一行中输出还原后纸条的正确拼接顺序。纸条编号间以一个空格分隔,行首尾不得有多余空格。

题目数据保证存在唯一解。

输入样例:

17
95 70 80 97 97 68 58 58 80 72 88 81 81 68 68 60 80
6
4 68 58 58 80
3 81 68 68
3 95 70 80
3 68 60 80
5 80 72 88 81 81
4 80 97 97 68

输出样例:

3 6 1 5 2 4

代码:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int n,m,p;
vector<int> b[11000];///存放第i行切碎的纸条的信息(m行)
int a[110000],number[11000],vis[11000],rem[11000],remlen=0;///a存放n个没切碎的纸条的信息、number第b[i]的长度、vis标记访问、rem记录拼接顺序、renlen是rem的长度
void dfs(int d,int k)///必须用深搜,否则会出现几个b数组都可以在同一个点拼接 但是最终拼接失败的情况(因为拼接成功的情况只有一个,所以每个可以拼接的点都尝试一遍)
{          ///d是已经拼接的 个数,k是当前对应的a数组的位置,即当前从a中哪个位置开始拼接if(d==m)///最终都拼接成功的情况只有一个,所以 当拼接了m个时,就找到了正确答案,直接输出即可{cout<<rem[0];for(int i=1; i<remlen; i++)cout<<' '<<rem[i];return;}for(int i=0; i<m; i++){if(!vis[i]){int flag=0;///当不符合时,flag标记为1 退出,  符合时 标记访问,记录顺序在rem中,remlen++,并且向下深搜for(int j=0; j<number[i]; j++){if(a[k+j]!=b[i][j]){flag=1;break;}}if(flag==0){rem[remlen++]=i+1;vis[i]=1;dfs(d+1,k+number[i]-1);vis[i]=0;rem[--remlen]=0;}}}
}
int main()
{int x;cin>>n;for(int i=0; i<n; i++)cin>>a[i];cin>>m;for(int i=0; i<m; i++){cin>>p;for(int j=0; j<p; j++){cin>>x;b[i].push_back(x);}number[i]=p;}dfs(0,0);return 0;
}

L3-3 可怜的简单题 (30 分)

九条可怜去年出了一道题,导致一众参赛高手惨遭团灭。今年她出了一道简单题 —— 打算按照如下的方式生成一个随机的整数数列 A:

最开始,数列 A 为空。

可怜会从区间 [1,n] 中等概率随机一个整数 i 加入到数列 A 中。

如果不存在一个大于 1 的正整数 w,满足 A 中所有元素都是 w 的倍数,数组 A 将会作为随机生成的结果返回。否则,可怜将会返回第二步,继续增加 A 的长度。

现在,可怜告诉了你数列 n 的值,她希望你计算返回的数列 A 的期望长度。

输入格式:
输入一行两个整数 n,p (1≤n≤10 11,n<p≤10 12),p 是一个质数。

输出格式:
在一行中输出一个整数,表示答案对 p 取模的值。具体来说,假设答案的最简分数表示为 yx,你需要输出最小的非负整数 z 满足 y×z≡x mod p。

输入样例 1:

2 998244353

输出样例 1:

2

输入样例 2:

100000000 998244353

输出样例 2:

3056898

原谅我看不懂题。。骗一分

代码:

print(1)

2022042020

2021年中国高校计算机大赛团体程序设计天梯赛相关推荐

  1. 1985年全国计算机编程大赛,关于举办2021年“中国高校计算机大赛-团体程序设计天梯赛”校内选拔赛的通知...

    程序设计能力是大学生利用计算机分析问题.解决问题的重要基础能力.为了推进该能力的培养,同时培养学生的团队合作精神,提高其综合素质,丰富校园学术气氛,促进校际交流,提高全国高校程序设计课程教学水平,教育 ...

  2. 中国高校计算机大赛(天梯赛)官网,我校获2019年“中国高校计算机大赛-团体程序设计天梯赛”全国三等奖...

    2019年3月30日,由北京大学等283所高校.775支队伍.7750人参加的第四届中国高校计算机大赛-团体程序设计天梯赛胜利举行.我校计算机科学与技术学院代表队进行了长达3小时紧张编程.奋勇拼搏,最 ...

  3. 河南计算机程序大赛,中国高校计算机大赛——团体程序设计天梯赛河南大学获佳绩...

    近日,第四届中国高校计算机大赛--团体程序设计天梯赛总决赛落下帷幕,我校由软件学院.计算机与信息工程学院共同派队参赛,最终荣获全国团队一等奖1项.二等奖1项.三等奖1项,河南省团队特等奖1项.一等奖1 ...

  4. 广东省计算机教育软件比赛,“中国高校计算机大赛-团体程序设计天梯赛” 广东赛点比赛在我校顺利举办...

    "中国高校计算机大赛-团体程序设计天梯赛" 广东赛点比赛在我校顺利举办 3月31日,2018年"中国高校计算机大赛-团体程序设计天梯赛"广东赛点比赛在我校石牌校 ...

  5. 中国高校计算机大赛(天梯赛)官网,中国高校计算机大赛——团体程序设计天梯赛校内辅导通知...

    程序设计能力是大学生利用计算机分析问题.解决问题的重要基础能力.为了推进该能力的培养,提高综合素质,丰富校园学术气氛,在教务处和信息学院的支持下,拟组队参加 2018 年3月至5月举办的第三届&quo ...

  6. 重庆大学计算机专业排名全国多少名,重庆大学成功晋级中国高校计算机大赛团体程序设计天梯赛全国总决赛...

    近期,第二届中国高校计算机大赛团体程序天梯赛大区赛落下帷幕,来自全国206所高校.112个专业的4750名学生参加了本次比赛.计算机学院组织全校30名学生组成3支队伍参赛,经过3个小时的激烈角逐最终获 ...

  7. 2021年中国高校计算机大赛-团队程序设计天梯赛(GPLT)L2四道题

    题目记不清了,但大致题意还有印象 L2-1 NNN个传送带,一个堆栈,堆栈大小为SmaxSmaxSmax,传送带=>=>=>队列,传送带不停的往堆栈里面推东西,或是用夹子从堆栈里面取 ...

  8. 2023 CCCC-GPLT 第8届中国高校计算机大赛-团体程序设计天梯赛

    目录 天梯赛 L1 基础级 L2 进阶级 天梯赛 L1 基础级 L1-1 最好的文档(5分) L1-2 什么是机器学习(5分) L1-3 程序员买包子(10分) L1-4 进化论(10分) L1-5 ...

  9. 华北水利水电大学c语言程序设计四_我校代表队在“中国高等计算机大赛——团体程序设计天梯赛” 中喜获佳绩...

    近日,第四届"中国高校计算机大赛--团体程序设计天梯赛"全国总决赛获奖名单公布,我校以全国高校排名第84位,河南省高校第4名的成绩获得河南省高校二等奖.我校派出的"NCW ...

最新文章

  1. 得分碾压人类的NLP系统诞生了,微软创CoQA挑战新纪录!
  2. varchar与nvarchar的区别
  3. 好东西+php,推荐个好东西swoole,php如虎添翼
  4. web前端培训分享:使用Dplayer实现Vue3中的视频及弹幕播放
  5. keycode对应主要键的关系
  6. Tachyon更名为 Alluxio,并发布1.0版本
  7. ajax上传图片的本质
  8. Exchange 2010 UM角色安装后无法启动服务,错误 1000,1001
  9. phpmyadmin出现缺少mysqli扩展问题
  10. Android转场动画深度解析(3)
  11. 怎么把python从c盘移到d盘_如何转移Pycharm的设置或者缓存到其他盘
  12. [生存志] 第57节 孔子微言春秋大义
  13. 在Letax中使用enumerate编辑 Step1 , Step2, ..... ,并设置缩进
  14. Layman数字土地指南
  15. JDK 17:Java 17 中的新特性
  16. python金融风控评分卡模型和数据分析
  17. css 随机 数,纯CSS实现随机效果
  18. 关于理性形象的塑造——歇洛克·福尔摩斯眼中的世界
  19. 【云计算】什么是云计算
  20. 如何设置无需fn直接按F1~F10

热门文章

  1. Unity 欢乐球球
  2. 平台开发——skynet——④socket通信、以及高度封装的socket.channel
  3. 【C#在资源管理器中显示自定义文件格式的缩略图】
  4. UEditor使用 设置不可编辑 设置可以编辑 (从不可编辑转换为可以编辑)
  5. java计算机毕业设计智能拼车系统源码+数据库+系统+lw文档+mybatis+运行部署
  6. nnUNet(代码)-预处理
  7. 论文插图用计算机绘制,科技论文插图的计算机绘制.pdf
  8. JUnit不好用?也许你可以尝尝这些测试工具
  9. 服务里没有oracle em,请Oracle安装后EM没有法用时怎么回事啊
  10. python源程序执行的方式边编译边执行_五年级Python试题