2021JMU天梯校选题解
Posted jiangxiaoju
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021JMU天梯校选题解相关的知识,希望对你有一定的参考价值。
原创不易,未经允许,请勿转载。
博客主页:https://blog.csdn.net/qq_43058685?spm=1001.2014.3001.5343
文章目录
- 括号匹配
- 子网掩码
- 上网课
- 列出叶节点
- TXT的女装比赛
- 画一个简单的长方体Or正方体
- 勋总的课之编译原理
- Diffcult and Magical Mathematical Bag
- 直捣黄龙
- 一的个数、 tly的生日、括号匹配、数名字、弛神的心是冰冰的、鬼谷八荒、拿金币、tly的巧克力
括号匹配
这题是考察对栈的使用。
当遇到’(’、’’、’[’ 这三个字符的时候就入栈,但遇到’)’、’’、’]'的时候,先对栈判断是否为空,若不为空,则对栈顶元素判断是否与之匹配。
注:如果是用char数组形式读入的话,在遍历前,先获取字符串长度,在开始遍历,不要在把strlen(str)写在循环语句中,这样是会TLE的
#include<bits/stdc++.h>
using namespace std;
bool isValid(string s)
stack<char> st;
int i;
for (i = 0; i < s.size(); i++)
if (s[i] == '(' || s[i] == '[' || s[i] == '')
st.push(s[i]);
else if (s[i] == ')')
if (st.empty())
return false;
char ch = st.top();
st.pop();
if (ch != '(')
return false;
else if (s[i] == '')
if (st.empty())
return false;
char ch = st.top();
st.pop();
if (ch != '')
return false;
else if (s[i] == ']')
if (st.empty())
return false;
char ch = st.top();
st.pop();
if (ch != '[')
return false;
if (st.empty())
return true;
else
return false;
int main()
string str;
cin >> str;
if(isValid(str))
cout << "YES" << endl;
else
cout << "NO" << endl;
子网掩码
这题就是到模拟题,需要用到位运算。
没学过计网的同学,可能会被一大段的题面给唬住。其实只要耐心读完题,就知道怎么做了。
#include<bits/stdc++.h>
using namespace std;
int main()
int a, b, c, d;
int x, y, z, k;
int n;
int aa, bb, cc, dd;
int a1, b1, c1, d1;
while (~scanf("%d.%d.%d.%d", &a, &b, &c, &d))
scanf("%d.%d.%d.%d", &x, &y, &z, &k);
aa = a & x; bb = b & y; cc = c & z; dd = d & k;
scanf("%d", &n);
while (n--)
scanf("%d.%d.%d.%d", &a1, &b1, &c1, &d1);
a1 = a1 & x; b1 = b1 & y; c1 = c1 & z; d1 = d1 & k;
if (a1 == aa && b1 == bb && c1 == cc && d1 == dd)
printf("INNER\\n");
else
printf("OUTER\\n");
return 0;
上网课
题解来自:勋总
先找到能覆盖<=1的工具人,然后选取能到最右的那个。
对于(最右右移一位,最右一位是可以区间恰不包含的相邻)以左的区间内,
再选取能到最右的那个,如果没能超过上一个的边界就舍弃。
不断贪心最右,直至贪到右边界。
可以证明,相同个数情况下,这个能到更右的地方,
因此不会有情况比该情况更优,所以贪心策略是正确的。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class Interval
private:
int s;//区间起点
int t;//区间终点
public:
Interval(int in_s, int in_t) : s(in_s), t(in_t)
int getS() return s;
int getT() return t;
;
//自定义比较
bool cmp(Interval interval_1, Interval interval_2)
if (interval_1.getS() == interval_2.getS())
return interval_1.getT() < interval_2.getT();
else
return interval_1.getS() < interval_2.getS();
int main()
//freopen("C:\\\\Users\\\\ylwhxht\\\\Desktop\\\\in1.txt", "r", stdin);
int n, targetSize;
int in_s, in_t;
cin >> n >> targetSize;
vector<Interval> v_interval;
for (int i = 0; i < n; i++)
cin >> in_s >> in_t;
Interval tmp_interval(in_s, in_t);
v_interval.push_back(tmp_interval);
//按照区间起点排序
sort(v_interval.begin(), v_interval.end(), cmp);
//初始化子问题的起点终点
int begin = 1;
int end = 1;
int ans = 1;
//处理每一个区间
for (int i = 0; i < v_interval.size(); i++)
int s = v_interval[i].getS();
int t = v_interval[i].getT();
//第一个区间就无法覆盖
if (i == 0 && s > 1)
break;
if (s <= begin)
end = max(end, t);
else
ans++;
begin = end + 1;//更新begin
if (s <= begin)
end = t;//更新end
else
break;
if (end >= targetSize)
break;
if (end < targetSize)
cout << "xie'e" << endl;
else
cout << ans << endl;
return 0;
列出叶节点
TXT的女装比赛
首先记录每个学校的学生有多少个,然后计算出每个学校的pass名额,最后遍历1-n/2排名里面的学生是否有PASS资格。
#include<bits/stdc++.h>
using namespace std;
int main()
int t;
cin >> t;
while (t--)
int n, m, k;
cin >> n >> m >> k;
vector<int> v(n);
unordered_map<int, int>mmid, mmid1;
for (auto& val : v)
cin >> val;
mmid[val]++;
for (auto val : mmid)
mmid1[val.first] = val.second / k;
int ans = 0;
int i;
for (i = 0; i < n / 2; i++)
if (mmid1[v[i]])
ans++;
mmid1[v[i]]--;
cout << ans << endl;
return 0;
画一个简单的长方体Or正方体
这题又是模拟题,不过属实毒瘤了点。要画出一个立体的长方体。
*
表示空白的地方,-
表示连线,+
表示每个连线之间的交点。
#include<bits/stdc++.h>
using namespace std;
char cub[100][100];
int main(void)
int T;
scanf("%d",&T);
while(T--)
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
for(int i=1; i<100; i++)
for(int j=1; j<100; j++)
cub[i][j]='*';
int d=2*b+1;
int f=2*b;
//上面
for(int i=1; i<=f; i++)
if(i%2)
for(int j=d; j<=d+2*a; j++)
if(j%2) cub[i][j]='+';
else cub[i][j]='-';
else
for(int j=d; j<=d+2*a; j++)
if(j%2) cub[i][j]='*';
else cub[i][j]='/';
d--;
//正面
int l=2*b+2*c+1;
int m=2*a+1;
for(int i=f+1; i<=l; i++) // f=2*b
if((i-f)%2)
for(int j=1; j<=m; j++)
if(j%2) cub[i][j]='+';
else cub[i][j]='-';
else
for(int j=1; j<=m; j++)
if(j%2) cub[i][j]='|';
else cub[i][j]='*';
//侧面
int indexi=2*b+1;
for(int j=m; j<=m+b*2; j++)
if((j-a*2)%2)
for(int i=indexi; i<=indexi+c*2; i++)
if((i-indexi)%2==0)
cub[i][j]='+';
else cub[i][j]='|';
else
for(int i=indexi; i<=indexi+c*2; i++)
if((i-indexi)%2==0)
cub[i][j]='/';
else cub[i][j]='*';
indexi--;
int row=b*2+1+c*2,col= a*2+b*2+1;
for(int i=1; i<=row; i++)
for(int j=1; j<=col; j++)
printf("%c",cub[i][j]);
puts("");
return 0;
勋总的课之编译原理
这题其实也没什么坑点,不过有以下几种情况要注意
向下面这种情况,应该输出/**/
这种注释类型,而里面的//
则需要被忽略
/*
// 这是一个注释
*/
向下面这种情况,应该输出//
这种注释类型,而里面的/**/
则需要被忽略
// /*这是一个注释*/
最后读入数据的时候应该处理到文件末尾,而不能通过判断开头第一个字符是否是’'来判断。发现很多人同学都这么判断。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
char buffer[maxn];
int main()
string tmp = buffer;
vector<string> v;
while (getline(cin, tmp))
v.push_back(tmp);
int flag = 0;
int type;
int begin, end;
begin = end = -1;
int i, j;
string str;
for (i = 0; i < v.size(); i++)
j = 0;
str = v[i];
while (j < str.size())
// flag为1的时候,表示在/**/注释范围内
if (flag)
while (j + 1 < str.size() && !(str[j] == '*' && str[j + 1] == '/')) j++;
if (j + 1 < str.size())
flag = 0;
end = i + 1;
cout << begin << ' ' << end << endl;
j += 2;
// 注释为/**/的情况
else if (j + 1 < str.size() && str[j] == '/' && str[j + 1] == '*')
flag = 1;
begin = i + 1;
j += 2;
以上是关于2021JMU天梯校选题解的主要内容,如果未能解决你的问题,请参考以下文章