jjzjj

2021XTU程设考试

Marhoosh 2024-01-11 原文

我是个菜鸡,天天被大佬吊打,这次考试的自己也只做出了第一题,惨遭挂科

xtu 1385 面积

正方形边长为1,E是对角线BD上一点,F是边AB上一点,已知|DE|=a/b|DB|,|BF|=c/d|AB|,求△CEF的面积。

思路:推公式,注意为负数的情况

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int a,b,c,d;
        scanf("%d %d %d %d",&a,&b,&c,&d);
        int m=b*d-a*c-a*d;
        int n=2*b*d;
        if(m==0){
            printf("0\n");
            continue;
        }  
        if(m<0)  m=abs(m);
        int k=__gcd(m,n);
        m/=k,n/=k;
        printf("%d/%d\n",m,n);
    }
    return 0;
}

xtu 1386 彩球

有n个球,标号为1∼n,第i个球有的颜色为ci。你需要选择3个不同颜色的球,问有多少种不同的选择方案?

思路:先hash统计各个颜色气球数量(可以map,unordered_map,unordered_map应该不会超时,map不知道)
然后因为直接数三个不同色的很困难,这里就得用到间接法,但是谢大认为这是小学三年级知识,其实我们大部分人都没想到.
就是用从n个球中选出3个球的方案数(即组合数C n 选3) 减去 三球同色 减去 两球同色,即为三球不同色的方案数,复杂度是O(n)的,可以接受

坑点:64位如果是scanf输入记得用__int64,不然会wa,用cin的可以不用管

#include<iostream>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
#define Debug(x) cout<<#x<<':'<<x<<endl
typedef long long ll;
#define INF 0x7fffffff//10^9级别,不到2^32
#define mo 20011
#define maxn 10000
ll re[mo+11];
inline ll hash1(ll n){
    ll x=n%mo;
    if(re[x]==INF)  {re[x]=n;return x;}
    else{
        ll i=0;
        while(re[(x+i)%mo]!=INF){
            if(re[(x+i)%mo]!=n) i++;
            else  return (x+i)%mo;
        }  
        re[(x+i)%mo]=n;
        return (x+i)%mo;
    }
}
void init(){//哈希表初始化
    for(ll i=0;i<mo;i++)  re[i]=INF;
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    ll t;
    cin>>t;
    while(t--){
        init();
        ll co[mo+11]={0};
        ll ar[mo+11]={0};
        ll n;
        cin>>n;
        for(ll i=1;i<=n;i++){
            ll t;cin>>t;
            co[hash1(t)]++;
        }
        ll step=0;
        for(ll i=0;i<mo;i++){
            if(co[i]!=0){
                ar[++step]=co[i];
            }
        }
        ll ans=n*(n-1)*(n-2)/6;
        for(ll i=1;i<=step;i++){
            if(ar[i]>=3)  ans=ans-ar[i]*(ar[i]-1)*(ar[i]-2)/6;
            if(ar[i]>=2)  ans=ans-ar[i]*(ar[i]-1)/2*(n-ar[i]);
        }
        cout<<ans<<endl;
    }
    return 0;
}

xtu 1387 完全区间

序列X由线性产生式 xn=axn−1+bxn−2,x0=x1=1 产生,
序列Y由线性产生式 yn=cyn−1+dyn−2,y0=y1=1 产生,
集合Z={x+y∣x∈X,y∈Y}。
现有区间[L,R],求最长的子区间[l,r],满足L≤l≤r≤R,∀z∈[l,r],z∈Z。

思路:题目看似数据量很大,到10^9,我也是一开始被吓到了
其实不然,仔细分析
因为斐波那契数列增长很快,约为2的x次方,指数级别
所以x中最多到差不多50项,就会超出1e9次方,即x中最多50个元素
同理,y中最多也只有50个,那么z中最多就只有50*50个
可以枚举产生Z 复杂度可以接受
最后再在L~R区间内遍历一遍,找出最长子区间即可

坑点:最好用64位,不然容易爆int,很多人re了我不知道什么原因

#include<bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")//解决递归函数多次调用栈溢出问题
using namespace std;
#define Debug(x) cout<<#x<<':'<<x<<endl
typedef long long ll;
#define INF 0x7fffffff//10^9级别,不到2^32
const ll maxn=1e9;
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
	ll t;
	cin>>t;
	while(t--){
		ll a,b,c,d,l,r;
		ll x[55]={1,1,1},y[55]={1,1,1};
		ll re[2555],step=1;
		cin>>a>>b>>c>>d>>l>>r;
		ll l1=2,l2=2;
		for(ll i=3;i<55;i++){
			x[i]=a*x[i-1]+b*x[i-2];
			l1++;
			if(x[i]<=0 || x[i]>=1e9)  break;
		}
		for(ll i=3;i<55;i++){
			y[i]=c*y[i-1]+d*y[i-2];
			l2++;
			if(y[i]<=0 || y[i]>=1e9)  break;
		}
		for(ll i=1;i<l1;i++){
			for(ll j=1;j<l2;j++){
				if(l<=x[i]+y[j] && x[i]+y[j]<=r){
					re[step++]=x[i]+y[j];
					//Debug(re[step-1]);
				}  
			}
		}
		sort(re+1,re+step);
		step=unique(re+1,re+step)-(re+1);
		if(step==0)  cout<<0<<endl;
		else{
			ll length=1,maxl=1;
			for(ll i=2;i<=step;i++){
				//Debug(re[i]);
				if(re[i]==re[i-1]+1){
					length++;
					if(length>maxl)  maxl=length;
				}  
				else  length=1;
			}
			cout<<maxl<<endl;
		}
	}
    return 0;
}

xtu 1388 积木

积木块都是相同的立方体,一共有n列积木堆,这n列积木排成一排,每堆上是ai个积木堆叠起来,并且保证从左到右,每列的积木数是非递减的。

现在你还有k个积木块,请把这k个积木块放到积木上(可以只用部分积木块,但不能堆新的列)。你想的到一个连续的积木列,并使得这些积木列具有相同的高度。

请问你能得到这样的积木列的最大宽度?

思路:
最长区间问题,容易想到尺取,要用尺取,序列就得满足单调性,这题随着区间长度递增,k值是递增的,满足单调性.
具体来说就是用两个指针,一个右指针指向区间右边端点,一个左指针指向区间左边端点,用sum值记录这个区间内满足连续积木列所需的木块数,当sum<=k时,右指针右移,区间长度+1,当sum>k时,左指针右移,区间长度-1.记录下满足条件的最大长度

小提示:“巨大的输入量,请使用stdio.h头文件,并使用C风格的输入”,这句话在xtu oj经常有,但其实关了同步,用cin也不是很慢.像这道题就是.

#include<bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
#define Debug(x) cout<<#x<<':'<<x<<endl
typedef __int64 ll;
#define INF 0x7fffffff//10^9级别,不到2^32
const ll maxn=10000+11;
ll ar[maxn];
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    ll t;
    cin>>t;
    while(t--){
        ll n,k;
        cin>>n>>k;
        for(ll i=1;i<=n;i++)  cin>>ar[i];
        ll l=1,r=1,length,maxl,k1=0;
        for(ll r=1;r<=n;r++){
            if(r==1){
                length=1;
                maxl=1;
            }  
            else{
                if(ar[r]!=ar[r-1])  k1=k1+(r-l)*(ar[r]-ar[r-1]);
                length++;
                while(k1>k){
                    k1=k1-(ar[r]-ar[l]);
                    length--;
                    l++;
                }
                if(length>maxl)  maxl=length;
            }
        }
        cout<<maxl<<endl;
    }
    return 0;
}

另一个思路:最长区间长度,由关键词最长,也容易想到二分,就是二分枚举最大宽度,对于每个宽度check下是否符合要求

xtu 1389 二叉查找树

n个元素,依次插入一颗初始为空的二叉查找树。对于第i个元素,其所在二叉查找书的左右子树深度差的绝对值为di,求max{di}。

板子题,直接套数据结构书上的模板就行了,思路没啥好讲的

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct Node * BST;
struct Node{
    int num;
    BST left;
    BST right;
};
int GetHeight(BST a);
BST Insert(BST a,int b);
BST Free1(BST a);
int max_num;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        max_num=0;
        int n;
        scanf("%d",&n);
        BST root;
        root=NULL;
        for(int i=0;i<n;i++){
            int b;
            scanf("%d",&b);
            root=Insert(root,b);
        }  
        GetHeight(root);
        printf("%d\n",max_num);
        Free1(root);//free大大减少OJ上的空间
    }
    return 0;
}
int GetHeight(BST a){
    if(!a)  return 0;
    int d,max_2,hl,hr;
    hl=GetHeight(a->left);
    hr=GetHeight(a->right);
    max_2=hl>hr?hl:hr;
    d=abs(hr-hl);
    if(d>max_num)  max_num=d;
    return (max_2+1);
}
BST Insert(BST a,int b){//递归插入相对耗时较长
    if(!a){//为空树时也可以插入
        a=(BST)malloc(sizeof(struct Node));
        a->num=b;
        a->left=a->right=NULL;
    }
    else{
        if(b>a->num)  a->right=Insert(a->right,b);
        else if(b<a->num)  a->left=Insert(a->left,b);
        //b==a->num情况不考虑
    }
    return a;
}
BST Free1(BST a){
    if(a){//若未考虑非空情况,会导致出错!
        if(a->left==NULL && a->right==NULL){
            free(a);
            a=NULL;
            return NULL;
        }  
        a->left=Free1(a->left);
        a->right=Free1(a->right);
        free(a);
        a=NULL;
        return NULL;
    }
    else  return NULL;
}

xtu 1390 字母计数

为了压缩一个只含小写英文字母的字符串,我们使用下面的方式表示它

任一字母c是表达式
任一字母c后接一个整数n也是一个表达式,表示把字母c重复n次,n是一个没有前导零的10进制整数,且 n≥2。
如果s1,s2是表达式,那么s1s2也是表达式。
S是一个表达式,那么(S)n也是表达式,表示将S这个表达式表示的字符串重复n次,n是一个没有前导零的10进制整数,且 n≥2。
比如表达式 ((a2b)2b)2a 表示字符串aabaabbaabaabba。

现在给你一个表达式,请统计一下其中各个字符出现的次数。

思路:很典型的递归处理,因为每次处理的字符串规则都是一样的,对于括号内的字符串,可以将它看成一个新字符串来递归处理.

坑点:oj的64位是真的坑,不小心用了个long long来用scanf转化输出字符就错了,建议大家在xtu oj上要么别用long long,要么用__int64,要么就不用scanf.

代码:

/*** 
 * @Practice Win
 * @打h_1,h_2
 */
#include<bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")//解决递归函数多次调用栈溢出问题
using namespace std;
#define Debug(x) cout<<#x<<':'<<x<<endl
typedef long long ll;
#define INF 0x7fffffff//10^9级别,不到2^32
ll cnt[222];
string sr;
ll number(ll l,ll r){//将数字字符串转化为整数
    ll ans=0;
    for(ll i=l;i<r;i++){
        ans=ans*10+sr[i]-'0';
    }
    return ans;
}
void solve(ll l,ll r,ll power){//递归处理,l是串起点,r是终点,power是串乘以的倍数
                            //关于power,因为括号后面可以接数字,表示几倍,所有需要power记录
    for(ll i=l;i<r;i++){
        if(sr[i]=='('){//如果是括号
            ll t=1,p=i+1;
            for(;p<r;p++){//找到这个括号对应的右括号位置
                if(t==0)  break;
                if(sr[p]=='(')  t++;
                if(sr[p]==')')  t--;
            }
            if(p<r && '1'<=sr[p] && sr[p]<='9'){//如果括号后面是数字
                ll l_t=p,r_t=p+1;
                while(r_t<r && '0'<=sr[r_t] && sr[r_t]<='9')  r_t++;
                solve(i+1,p-1,number(l_t,r_t)*power);
                i=r_t-1;
            }
            else{//如果括号后面不是数字
                solve(i+1,p-1,power);
                i=p-1;
            }
        }
        else{//如果是小写字母
            if(i+1<r && '1'<=sr[i+1] && sr[i+1]<='9'){//如果字母后面是数字
                ll l_t=i+1,r_t=i+2;
                while(r_t<r && '0'<=sr[r_t] && sr[r_t]<='9')  r_t++;
                cnt[sr[i]]=cnt[sr[i]]+number(l_t,r_t)*power;
                i=r_t-1;
            }
            else{//如果后面不是数字
                cnt[sr[i]]=cnt[sr[i]]+power;
            }
        }
    }
    return ;
}
void init(){
    memset(cnt,0,sizeof(cnt));//cnt数组初始化
}
void out(){//输出函数
    for(char i='a';i<='z';i++){
        if(cnt[i]==0)  continue;
        cout<<i<<" : "<<cnt[i]<<endl;
    }
    cout<<endl;
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    while(cin>>sr){
        init();
        solve(0,sr.length(),1);
        out();
    }
    return 0;
}

头一次发现自己也能写出来这么好看的且规范的代码了,main函数里几个函数就搞定了(窃喜)

有关2021XTU程设考试的更多相关文章

  1. 中国民用飞机制造行业市场现状规模及发展战略规划报告2021-2027年 - 2

    中国民用飞机制造行业市场现状规模及发展战略规划报告2021-2027年详情内容请咨询鸿晟信合研究院!【全新修订】:2022年2月【撰写单位】:鸿晟信合研究研究【报告目录】第1章:中国民用飞机制造行业发展综述1.1民用飞机制造行业概述1.1.1民用飞机的概念1.1.2飞机制造的概念1.1.3民用飞机的分类1.2民机制造行业周期特性1.2.1影响行业周期的因素(1)GDP增速分析(2)运量增量分析(3)飞机更替分析(4)航空公司获利水平1.2.2行业现阶段周期分析1.2.3行业现阶段景气分析1.3民机制造信息化分析1.3.1信息化技术应用状况分析(1)MDO技术应用分析(2)供应链协同研发分析(3

  2. ruby-on-rails - 如何获得积极的考试心态? - 2

    我想为我的应用程序编写测试,尽管每次我查看rspec.info时,我真的没有看到一个明确的路径来实现“做正确的事情”并首先进行测试。我不止一次在rspec上观看了peepcode视频,但没有用。我想对自己的工作更加自豪,我认为测试会有所帮助。怎样才能突破这个心理障碍? 最佳答案 寻找可以奖励您进行测试的工具。例如,使运行所有测试变得非常容易并得到类似这样的消息73testspassed.尝试randomtesting因为您可以快速轻松地针对大量值进行测试。查看您的语言是否提供测试覆盖率分析工具,该工具可以为您提供语句覆盖率百分比或b

  3. 大学C语言期末考试题库试题及答案(1) - 2

    1.下列定义变量的语句中错误的是______。A、int_intB、doubleint_C、charForD、floatUS$答案:D知识点:常量、变量和标识符2.以下不合法的用户标识符是______。A、j2_KEYB、DoubleC、4dD、_8_答案:C知识点:常量、变量和标识符3.以下4组用户定义标识符中,全部合法的一组是______。A、_mainencludesinB、If-maxturboC、txtREAL3COMD、intk_2_001???答案:A知识点:常量、变量和标识符4.以下定义语句中正确的是______。A、chara='A'b='B';B、floata=b=10.0

  4. 2023年图情档研究生入学考试专业课真题回忆版 - 2

    文章目录2023年四川大学图情档研究生入学考试专业课真题回忆版667信息管理基础名词解释(25分)简答题(25分)分析题(100分)972信息检索辨析题(25分)简答题(45分)分析题(80分)2023年四川大学图情档研究生入学考试专业课真题回忆版667信息管理基础名词解释(25分)实得信息信息采准率信息需求信息分化开放存取简答题(25分)简述信息资源的基本特征说明信息资源质量不高的原因列举两个信息社会理论简述知识结构体系结构的特点数字图书馆有哪些发展新趋势?分析题(1

  5. [2021] 完美解决Unable to find image ‘hello-world:latest‘ locally 问题 - 2

    安装Docker出现的问题相信大家查询了很多的回答里面都是需要修改阿里镜像源,但是修改之后却无用。这是因为阿里那个源对于每个人来说都需要专属源。详细的内容可以参考菜鸟教程里的回答:菜鸟教程更换镜像源接下来就简单的完成这个这个更换源的操作(当时花了接近3小时,害):1.首先创建deamon.json文件用来保存源vim/etc/docker/daemon.json2.添加稳定而且不经常变动的镜像源,这里选择中科大的源{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"]}当然也可以选择其他的源:网易:https://hub-mirr

  6. 667真题 | 基于ChatGpt提供2021-2023年川大667分析题答题思路 - 2

    文章目录ChatGpt简介2021为四川大学图书馆设计“以xxx的读书之道”为主题的阅读推广活动图书情报档案事业在shisiwu期间的发展定位,发展重点的认识图书情报档案工作在新时代建设文化强国的功能、作用和发展路径的认识当今网络环境下社会大众的网络信息行为对现代图书情报服务的影响认识《图书馆学五定律》在大数据时代图书情报档案管理服务中的适用性和发展性的认识2022年新时代公共文化服务体系建设中发挥图书情报档案机构作用的思路和对策图书情报档案机构如何充分利用数字人文等新兴技术手段开发信息资源,提升服务能力高校图书馆大力推进机构知识库建设的意义以及在数字化建设中的作用数字中国与网络强国建设下数据

  7. 2021年中国小麦行业发展现状分析,行业种植设施化、管理进准化发展「图」 - 2

    一、概述小麦是小麦属植物的统称,代表种为普通小麦是禾本科植物,是一种在世界各地广泛种植的谷类作物,小麦的颖果是人类的主食之一,磨成面粉后可制作面包、馒头、饼干、面条等食物,发酵后可制成啤酒、酒精、白酒(如伏特加),或生物质燃料。小麦按籽粒的皮色可分为红皮小麦和白皮小麦;按籽粒的粒质可分为硬质小麦和软质小麦;按播种的季节可分为春小麦和冬小麦。小麦按不同方式分类情况​编辑添加图片注释,不超过140字(可选)资料来源:公开资料整理二、产业链小麦行业产业链上游主要为麦种、化肥、农药等行业;中游为小麦的种植;下游的应用领域主要为食品、饲料、酒类、燃料等领域。小麦行业产业链结构​编辑添加图片注释,不超过1

  8. 桂电 数电实验 期末考试 试卷+解析(74LS192 + 74LS153 + 74LS139 + 74LS00 / 74LS20) - 2

    目录考试注意事项A卷  74LS192+74LS00B卷  74LS153+74LS00/74LS20+ 74LS139 C卷  74LS153+74LS00/74LS20+ 74LS139课程感悟考试注意事项1.考试前请检查实验箱号和仪器号与座位号是否一样,不一样请请示老师更换;2.请自行检查导线、芯片、仪器的好坏,如有问题,请及时找教师更换;否则由于导线、芯片损坏而影响考试结果的,后果自负;3.不得自行拔下实验箱芯片,除非老师确认芯片损坏后方能更换;否则作为蓄意损坏实验仪器设备论处,根据情况扣20~40分;4.实验完毕后收拾仪器和实验桌为实验基本素质,不收拾仪器者将根据情况扣分(10分内)

  9. 2022华为机试社招OD高频考试真题【9, 10月份Q2, Q3考试新编程题目】 - 2

    华为机试真题https://www.online1987.com/2022华为社招OD高频考试真题【9,10月份Q1,Q2考试新编程题目】https://www.online1987.com/%E9%A2%98%E7%9B%AE%E5%AF%BC%E8%88%AA/最长广播效应https://www.online1987.com/%E6%9C%80%E9%95%BF%E5%B9%BF%E6%92%AD%E6%95%88%E5%BA%94/某通信网络中有N个网络结点,用1到N进行标识。网络中的结点互联互通,且结点之间的消息传递有时延,相连结点的时延均为一个时间单位。现给定网络结点的连接关系lin

  10. OWASP—Top10(2021知识总结) - 2

    OWASPtop102021年版TOP10产生三个新类别,且进行了一些整合考虑到应关注根本原因而不是症状。A01:失效的访问控制​从第五位上升称为Web应用程序安全风险最严重的类别,常见的CWE包括:将敏感信息泄露给未经授权的参与者、通过发送的数据泄露敏感信息、跨站请求伪造(csrf)风险说明:​访问强制实施策略,使用户无法在其预期权限之外操作。失败的访问控制通常导致未经授权的信息泄露,修改或者销毁所有数据,或在用户权限之外执行业务功能。常见的访问控制脆弱点:违法最小权限原则或默认拒绝原则,即访问权限应只授予特定能力、角色或用户,但实际上任何人都可以访问通过修改URL(参数修改或强制浏览),内

随机推荐