2021JMU天梯校选题解

Posted jiangxiaoju

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021JMU天梯校选题解相关的知识,希望对你有一定的参考价值。

原创不易,未经允许,请勿转载。

博客主页:https://blog.csdn.net/qq_43058685?spm=1001.2014.3001.5343

文章目录

括号匹配

这题是考察对栈的使用。
当遇到’(’、’’、’[’ 这三个字符的时候就入栈,但遇到’)’、’’、’]'的时候,先对栈判断是否为空,若不为空,则对栈顶元素判断是否与之匹配。

注:如果是用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天梯校选题解的主要内容,如果未能解决你的问题,请参考以下文章

20171001四校联考

2017 10 01国庆节大礼包 四校联考

如何旋转我单击的立方体而不是所有立方体同时旋转?

2022届互联网公司校招后端技术研发笔试

如何将立方体变成脸[重复]

在 3D 空间中绘制立方体