2021天梯总决赛题解

文章目录

  • 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-2 还原文件 (30 分)
      • 1.暴力骗26分做法
      • 分析
      • 代码
      • 2.正解
      • 分析
      • 代码

L1-1 人与神 (5 分)

分析

输出题,直接输出即可

代码

php代码【狗头】

To iterate is human, to recurse divine.

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

分析

n为总字数,k是每分钟看的,m是看的时间,答案即为n-k*m

代码
#include <bits/stdc++.h>
using namespace std;
int main()
{int n,k,m;cin >> n >> k >> m;cout << n - k * m << endl;
}

L1-3 强迫症 (10 分)

分析

用字符串if else即可

代码
#include <bits/stdc++.h>
using namespace std;
int main()
{string s;cin >> s;if(s.size() == 4){if(((s[0] - '0') * 10 + s[1] - '0') < 22){cout << 2 << 0 << s[0] << s[1] << "-" << s[2] << s[3];}else{cout << 1 << 9 << s[0] << s[1] << "-" << s[2] << s[3];}}else {cout << s[0] <<s[1] << s[2] << s[3] << "-" << s[4] << s[5];}
}

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

分析

每次比较,循环加if即可,注意数据类型是double。

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;ll n;
double m;
double p;
int main()
{cin >> n >> m;while(n--){cin >> p;if(p < m)cout << "On Sale! " <<fixed << setprecision(1) << p << endl;}
}

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

分析

同1-4,循环加if比较即可

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;ll moon[105];
int main()
{for(ll i = 0;i < 24;i++){cin >> moon[i];}ll num;while(cin >> num && num < 24 && num >= 0){if(moon[num] > 50){cout << moon[num] <<" " <<"Yes" << endl;}else{cout << moon[num] <<" " << "No" << endl;}}
}

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

分析

读入使用getline函数,因为题目中存在空格,使用cin无法读入完全,同时记得在读入nm之后使用getchar()消除多余符号。

这里可以用到字符串的一个子串查找功能,格式为s.find(“xx”)==string::npos

如果不能找到,则find函数会返回真,反之如果找到了,则会返回假。

坑点:注意要把全部读入再判断,如果读入和循环在一起,有可能会导致无法读入完全,同时数据可能存在输入行数多于规定n的情况,建议使用for循环规定读入行数读入,而不是用while

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;ll n,m;
string s[35];
int main()
{cin >> n >> m;getchar();for(ll i = 0;i < n;i++){//保证数据完全读入getline(cin,s[i]);}ll num = 0;bool flag = 1;for(ll i = 0;i < n;i++){if(s[i].find("qiandao") == string::npos &&s[i].find("easy") == string::npos){num++;}if(num == m + 1){cout << s[i];flag = 0;break;}}if(flag)cout << "Wo AK le";
}

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

分析

给提供的数据排序,然后从前往后和从后往前分别遍历,来看最小值和最大值的数目。

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e6 + 10;
ll n,m;
ll a[N];
int main()
{cin >> n;for(ll i = 0;i < n;i++){cin >> a[i];}sort(a,a + n);ll minNum = 1;for(ll i = 0;i < n;i++){if(a[i] != a[i + 1])break;minNum++;}ll maxNum = 1;for(ll i = n - 1;i >= 0;i--){if(a[i] != a[i - 1])break;maxNum++;}cout << a[0] << " " << minNum << endl;cout << a[n - 1] << " " << maxNum;return 0;
}

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

分析

模拟题,使用动态数组,设定一个遍历下标值,每次进一个,然后将得到的乘积转化为字符串,按位录入字符串,这里使用了to_string函数,可以将数字转换为字符串。

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll>ans;
ll a,b,c,n;
int main()
{ll num = 0;//设定的遍历下标值cin >> a >> b >> n;ans.push_back(a);ans.push_back(b);while(ans.size() < n){c = ans[num] * ans[num + 1];num++;if(c / 10){string tmp = to_string(c);//将c转换为字符串存储for(ll i = 0;i < tmp.size();i++){ans.push_back(tmp[i] - '0');//存入数,故减去字符0}}elseans.push_back(c);}for(ll i = 0;i < n;i++){if(i) cout << " ";cout << ans[i];}cout << endl;
}

L2-1 包装机 (25 分)

分析

栈和队列的模拟,按照题意写就可以了,注意题目给定的特殊情况:1.框满了2.被选中轨道空,3.筐空

题解
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ll n,m,s;stack<char>box;//筐queue<char>q[105];//轨道queue<char>stream;//流水线ll num;string str;cin >> n >> m >> s;for(ll i = 1;i <= n;i++){cin >> str;//用字符串读入for(ll j = 0;j < str.size();j++){q[i].push(str[j]);//按位存入轨道}}while(cin >> num && num != -1){//输入操作,当碰到-1停止if(num != 0 && q[num].size()){//注意轨道为空则不操作if(box.size() == s){//筐满时stream.push(box.top());box.pop();}box.push(q[num].front());q[num].pop();}else if(num == 0 && box.size()){//注意筐为空则不操作stream.push(box.top());box.pop();}}while(stream.size()){cout << stream.front();stream.pop();}return 0;
}

L2-2 病毒溯源 (25 分)

分析

通过并查集来将病毒建成一颗树,注意不能更新路径,然后从0到n - 1遍历,来向上找,来寻找最长的变异链的长度,然后将所有长度为最长的变异链放入动态数组,排序最小的即是我们要找的变异链。

代码
#include <bits/stdc++.h>
using namespace std;
#define ll int
const ll N = 1e4 + 10;
ll p[N];
ll a,k;
ll n;
ll maxn = -1;
vector<ll>ans[N];
ll find_root(ll x,ll val)
{while(p[x] != x){x = p[x];val++;}return val;
}stack<ll>box;
int main()
{scanf("%d",&n);for(ll i = 0;i < n;i++){p[i] = i;}for(ll i = 0;i < n;i++){scanf("%d",&k);for(ll j = 0;j < k;j++){scanf("%d",&a);p[a] = i;}}for(ll i = 0;i < n;i++){ll tmp = find_root(i,1);if(tmp > maxn){maxn = tmp;}}ll idx = 0;for(ll i = 0;i < n;i++){if(find_root(i,1) == maxn){ll tmp = i;while(p[tmp] != tmp){box.push(tmp);tmp = p[tmp];}box.push(tmp);while(box.size()){ans[idx].push_back(box.top());box.pop();}idx++;}}sort(ans, ans + idx - 1);printf("%d\n",maxn);for(ll i = 0;i < ans[0].size();i++){if(i)printf(" ");printf("%d",ans[0][i]);}return 0;
}

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

分析

建议用vector数组存储输出,使用map映射来存储输出相同的组,当两组数目相同的,使用cmp函数逐个比较vector的大小。

注意:若考虑使用string存储输出的话,一个是数字有一位有两位,可能存在数字和空格比较,若解决了这个问题,也会有字符串的长度过长导致超时的问题,这题卡常,使用cincout的话需要关闭同步流。

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define fi first
#define se secondmap<vector<ll>,ll>ma;
pair<vector<ll> ,ll>p[10005];
ll n,m;
bool cmp(pair<vector<ll> ,ll> x,pair<vector<ll> ,ll> y)
{if(x.se == y.se){//如果两组数目相同for(ll i = 0;i < x.fi.size();i++){//遍历输出if(x.fi[i] != y.fi[i])//碰到输出不同的元素return x.fi[i] < y.fi[i];//按元素大小从小到大排序}}return x.se > y.se;//若数目不同,返回数目大的
}int main()
{ios::sync_with_stdio(false);cin >> n >> m;vector<ll>tmp;//输入临时存储数组ll num;for(ll i = 0;i < n;i++){tmp.clear();//将临时数组清空for(ll j = 0;j < m;j++){cin >> num;tmp.push_back(num);}ma[tmp]++;//记录输出相同的数目}ll idx = 1;//pair的下表,pair的first元素存储输出的数组,second元素存储这样输出的有多少组for(auto it = ma.begin();it != ma.end();it++,idx++){//遍历map,将map中元素存入pair数组中p[idx].fi = it->fi;p[idx].se = it->se;}idx--;//最后idx多遍历一次,减去sort(p + 1,p + idx + 1,cmp);//给pair数组排序,排序规则见cmpcout << ma.size() << endl;for(ll i = 1;i <= idx;i++){cout << p[i].se;for(ll j = 0;j < p[i].fi.size();j++){cout << " " << p[i].fi[j];}if(i != idx)cout << endl;}
}

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

分析

模拟题,按照题意写就可以了,主要难度在于读题.

同样卡常,需要关闭同步流。

题目大意:哲哲通过每一个剧情点都能有一些能到达的剧情点,比如我当前在第一关,能到达2关3关和4关,则第一个输入即为3 2 3 4,第一个3为能到达的剧情点数量,之后进行m次操作,每次输入0,1,2对应输入种类,后面的j表示对应的操作位置

0:从当前剧情点做出了第j个选择,即选择了当前动态数组j - 1下标的存档(动态数组下标从0开始)

1:表示存档,用map存储,第j个点的second值就是当前位置,同时将当前存档的位置输出

2:读取存档,读取第j个存档,当当前状态更新成键值为j的map对应的值

代码
#include <bits/stdc++.h>
using namespace std;
#define se second
#define fi first
typedef long long ll;
const ll N = 1e5 + 10;
vector<ll> p[N];
ll st[105];
ll a;
map<ll,ll>ma;
ll num;
ll n,m;
int main()
{ios::sync_with_stdio(false);//关闭同步流cin >> n >> m;//n为剧情点个数,m为游戏操作for(ll i = 1;i <= n;i++){cin >> num;//num表示第i个剧情点能到的剧情点个数for(ll j = 0;j < num;j++){cin >> a;p[i].push_back(a);//将第i个剧情点能到达的剧情点存入第i个动态数组}}ll ch;ll now = 1;//当前在的剧情点ll j;while(m--){cin >> ch >> j;if(ch == 0){now = p[now][j - 1];}else if(ch == 1){ma[j] = now;cout << now  << endl;}else if(ch == 2){now = ma[j];}}cout << now;return 0;
}

L3-2 还原文件 (30 分)

1.暴力骗26分做法
分析

暴力比较即可,多次遍历查找跟当前折点相同的碎片,直到找完为止。测试点2会超时。

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e5 + 10;
ll a[N];
ll n,m;
ll num;
ll k;
vector<ll>p[105];
int main()
{ios::sync_with_stdio(false);cin >> n;for(ll i = 1;i <= n;i++){cin >> a[i];}cin >> m;for(ll i = 1;i <= m;i++){cin >> k;for(ll j = 0;j < k;j++){cin >> num;p[i].push_back(num);}}ll idx = 1;while(1){if(idx == n)break;for(ll i = 1;i <= m;i++){bool flag = 1;ll tmp = idx;if(p[i][0] == a[idx]){for(ll j = 0;j < p[i].size();j++,tmp++){if(p[i][j] != a[tmp]){flag = 0;break;}}tmp--;if(flag)idx = tmp;if(flag && idx != n)cout << i << " ";else if(flag && idx == n)cout << i;}}}
}
2.正解
分析
代码

2021第六届天梯赛cccc总决赛题解相关推荐

  1. 2021第六届GPLT 团体程序设计天梯赛CCCC 个人题解

    目录 L1-1 人与神 Code L1-2 两小时学完C语言 Code L1-3 强迫症 思路 Code L1-4 降价提醒机器人 Code L1-5 大笨钟的心情 思路 Code L1-6 吉老师的 ...

  2. 集美大学第七届天梯赛校选题解

    目录 赛事总结 题目方面 出题组 难度把控 模拟程度 L1 基础级 L1-1 最菜的 算法思路 代码实现 L1-2 复读机 思路 代码实现 L1-3 JMU仓颉再现--绝绝子的何式汉字 题意 解题思路 ...

  3. 2021年团体程序设计天梯赛-总决赛L2题解

    2021年团体程序设计天梯赛-总决赛! L2-1 包装机 思路:模拟 代码: #include<bits/stdc++.h> using namespace std; int main() ...

  4. 第十六届智能车竞赛总决赛线上比赛赛道设计

    简 介: 根据2021年第十六届全国大学生智能汽车竞赛组委会商议确定使用线上比赛的方式完成比赛的后半程,全国总决赛.这种方式与以前的线上比赛相比具有相同性,也有其特殊性.需要在线上比赛的赛道设计以及比 ...

  5. 第六届省赛(软件类)真题----Java大学A组答案及解析

    第六届省赛(软件类)真题----Java大学A组答案及解析 熊怪吃核桃 星系炸弹 九数分三组 循环节长度 打印菱形 加法变乘法 牌型种数 移动距离 垒骰子 灾后重建 一.熊怪吃核桃 森林里有一只熊怪, ...

  6. 第六届省赛(软件类)真题----Java大学B组答案及解析

    第六届省赛(软件类)真题----Java大学B组答案及解析 三角形面积 立方变自身 三羊献瑞 循环节长度 九数组分数 加法变乘法 牌型种数 饮料换购 垒骰子 生命之树 一.三角形面积 如[图1]所示. ...

  7. 第六届省赛(软件类)真题----Java大学C组答案及解析

    第六届省赛(软件类)真题----Java大学C组答案及解析 隔行变色 立方尾 无穷分数 循环节长度 格子中输出 奇妙的数字 加法变乘法 移动距离 打印大X 垒骰子 一.隔行变色 Excel表的格子很多 ...

  8. L2-4 彩虹瓶 (25 分)-2019天梯赛全国总决赛

    彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N).现 ...

  9. NYOJ-682 小媛在努力 (郑大第六届校赛 模拟)

    链接:click here 题意: 描述 在多媒体数据处理中,数据压缩算法尤为重要.小媛上完课后就想自己发明一个数据压缩算法.她想呀想,终于想到一个方法.在多媒体数据中有很多数据都是重复的,所以她想把 ...

最新文章

  1. 怎么绘制机械孔_机械图纸中常见的符号及意义,机械人必备!
  2. 使用Nomad构建弹性基础架构:计划和自我修复
  3. 自媒体敏感词大全_2020年自媒体软件大全,这里真的有大宝贝……
  4. [codevs 1915] 分配问题
  5. 主曲率 matlab,基于Matlab的Hertz接触参数和主曲率差函数关系的拟合
  6. 使用SAP UI5 Web Components开发React应用
  7. Hologres如何支持超高基数UV计算(基于roaringbitmap实现)
  8. No result defined for action com.lk.IndexAction and result success
  9. wxpython中文手册 官方版_wxPython API参考手册.chm
  10. html过滤 -java_PHP过滤各种html标签
  11. Hyper-V复制配置前评估
  12. cad线性标注命令_CAD线性标注快捷键是什么,怎么使用
  13. 雷电html查看程序编辑程序,NC程序编辑器(nEditor)
  14. leetcode 347
  15. 算法设计与分析——动态规划(二):钢条切割
  16. java简单实现求平方根
  17. 天猫四大独门利器,助力品牌引领消费趋势
  18. IP地址,子网掩码,默认网关,DNS服务器详解
  19. python——之self参数
  20. D. Tournament Countdown

热门文章

  1. python数据分析考试题库_Python数据分析与数据可视化章节考试题库
  2. get请求在ie浏览器中缓存问题
  3. c语言程序转python_使用f2py将C语言的函数转换为python模块
  4. 无人驾驶实战第一课--七月在线
  5. 从截图里面识别数字_【答疑解惑】还没成功入驻数字工坊的同学看过来!!!
  6. 经济基础知识(中级)【5】
  7. Penalty-Based Multibody Animation(1)
  8. ZCMU-1411 喜闻乐见的a+b
  9. 卡斯特:中国是一个全球化的大试验
  10. ArcGIS API for Silverlight 绘制降雨路径动画