天津大学2024-2025 预推免 机试题目及本人题解(第一批)

时间2024年8月30日 

所有题目  内存限制:128 MB    时间限制:1.000S 

目录

题目A:流量计费

题目B:买水果

题目C:星期几?

题目D:完美子序列

题目E:最长子串


题目A:流量计费

题目描述
某运营商手机流量的收费规则是:每月要收取基本费用10元,提供500GB的免费流量,对于超出的流量部分则按1元/GB收费。现在给出用户John当月的流量清单,你能帮他算出应该交纳的费用吗?
输入
输入数据有若干组。第一行为整数T(1≤T≤10)表示数据的组数,接着依次输入T组数据。对于每组数据,第一行为整数m(1≤m≤10)表示数据内包含的流量记录条数,接下来输入m行,每行包含一个整数si(1 ≤si≤1000)表示使用的流量数。

输出
对于每组清单,输出一行指出应交纳的费用。

样例输入

2
2
100
300
3
100
400
20

样例输出 

10
30

个人题解

#include <iostream>
using namespace std;
int cost(int a){
	if(a<=500) return 10;
	else return 10+a-500;
}
int main(){
	int T;
	cin>>T;
	while(T--){
		int x;
		cin>>x;
		int sum=0;
		for(int i=0;i<x;i++){
			int t;
			cin>>t;
			sum+=t;
		}
		cout<<cost(sum)<<endl;
	}
	return 0;
}

题目B:买水果

题目描述
宿舍楼下的水果摊正在搞促销活动,每买一个大小为A(1≤A≤1000000)的苹果,就免装赠送一个大小为B(1≤B<A)的橘子(送完为止,先到先得)。John最喜欢吃橘子,但不幸的是,橘子只能通过赠送的方式获得,不可以直接购买。水果摊上现有N(1≤N≤1000)个苹果和M(1≤M≤1000)个橘子,给出每个苹果和橘子的大小,请帮助John算出他最多可以得到多少个橘子?
输入
第一行输入一个整数T(1 ≤T≤10)表示包含的数据组数。接下来依次输入每组数据,对于每组数据,第1行:2个整数,分别为N和M,中间用空格隔开。第2至N+1行:每行给出一个整数,表示苹果的大小。第N+2至N+M+1行:每行给出一个整数,表示橘子的大小。
输出
对于每组数据输出一行,指出John最多可以得到的橘子数

样例输入

2
3 3
4
5
6
3
4
5
3 3
1
8
7
8
6
1

样例输出

3
2

提示
注意,每购买一个苹果便可以挑选一个比这个苹果小的橘子。共有2组数据。第一组数据,购买大小为6 5 4的苹果,对应分别挑选大小为5 4 3的橘子便可以获得3个橘子。第二组数据,购买大小为8 7的苹果,对应分别挑选大小为6 1的橘子便可以获得2个橘子。 

个人题解

#include <iostream>
#include <climits>
using namespace std;
int main(){
	int T;
	cin>>T;
	while(T--){
		int n,m;
		cin>>n>>m;
		int a[1000],b[1000];
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		for(int i=0;i<n;i++){
			cin>>b[i];
		}
		int num=0;	
		for(int i=0;i<m-1;i++){
			for(int j=0;j<m-i+1;j++){
				if(b[i+1]>b[i]){
					swap(b[i+1],b[i]);
				}
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(a[i]>b[j]){
					num++;
					b[j]=INT_MAX;
				}
			}
		}
		cout<<num<<endl;
	}
	return 0;
}

题目C:星期几?

题目描述
给出日期,请算出是星期几?
输入
第一行包含一个整数T(1≤T≤20)表示包含的数据组数。每组数据只有一行,以年月日形式给出日期,格式为"XXXX-XX-XX"。所有给出的日期都是合法的,并且都不会早于1900-01-01。
输出
对于每组数据输出一行指出当前日期是周几(周日:Sunday,周一:Monday,/周二:Tuesday,周三:Wednesday,周四:Thursday,周五:Friday,周六:Saturday)

样例输入

2
1900-01-01
2008-12-07

样例输出

Monday
Sunday

提示
1. 1900年1月1日是星期一。
2. 4,6,11和9月有30天。其他月份除了2月有31天。闰年2月有29天,平年2月有28天。
3. 年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年)。
4. 规则3不适合于世纪年。可以被400整除的世纪年为闰年,否则为平年,所以,1700,1800,1900和2100年是平年,而2000年是闰年。 

个人题解

#include <iostream>
#include<cstdlib>
using namespace std;
void printWeek(int a)
{
	if(a==1) cout<<"Monday"<<endl;
	else if(a==2) cout<<"Tuesday"<<endl;
	else if(a==3) cout<<"Wednesday"<<endl;
	else if(a==4) cout<<"Thursday"<<endl;
	else if(a==5) cout<<"Friday"<<endl;
	else if(a==6) cout<<"Saturday"<<endl;
	else cout<<"Sunday"<<endl;
}
int isrunyear(int y){
	if((y%4==0&&y%100!=0)||(y%100==0&&y%400==0)) return 1;
	else return 0;
}
int main(){
	int T;
	cin>>T;
	while(T--){
		int y,m,d;
		int rund = 30*4+31*7+29;
		int pingd = 30*4+31*7+28;
		int sum = 0;
		scanf("%d-%d-%d",&y,&m,&d);
		if(y>1900){
			for(int i=1900;i<y;i++){
				if(isrunyear(i)) sum+=rund;
				else sum+=pingd;	
			} 
		}
		if(m<2) sum+=d;
		else if(m==2) sum+=(31+d);
		else{
			if(isrunyear(y)==0){
				if(m<=4) sum+=(31*(m-1)-3+d);
				else if(m>4&&m<=6) sum+=(31*(m-1)-4+d);
				else if(m>6&&m<=9) sum+=(31*(m-1)-5+d);
				else if(m>9&&m<=11) sum+=(31*(m-1)-6+d);
				else sum+=(31*(m-1)-7+d);
			}
			else{
				if(m<=4) sum+=(31*(m-1)-2+d);
				else if(m>4&&m<=6) sum+=(31*(m-1)-3+d);
				else if(m>6&&m<=9) sum+=(31*(m-1)-4+d);
				else if(m>9&&m<=11) sum+=(31*(m-1)-5+d);
				else sum+=(31*(m-1)-6+d);
			}
		}
		printWeek(sum%7);
	}
	return 0;
}

题目D:完美子序列

题目描述
给出一个长度为N(1≤N≤50000)的数字队列,定义完美区间为数字队列中连续的一段,并且其中最大与最小数字之差不得超过M(1 ≤M≤50000)。
输入
第一行包含一个整数(1 ≤T≤50)表示包含的数据组数。对于每组数据第1行:包含N和M两个整数,中间用空格隔开。
第2行:给出N个整数的数字队列,且所有的整数都在1到1000000之间

输出
对于每组数据输出一行,指出最长完美区间的长度。 

样例输入 

2
9 10
19 18 16 18 6 6 11 13 14
5 8
17 19 13 18 14

样例输出

5
5

提示
共有2组数据,第一组中的最长完美区间为6 6 11 13 14,第二组最长完美区间为17 19 13 18 14。 

个人题解 

#include <iostream>
using namespace std;
int main(){
	int T;
	cin>>T;
	while(T--){
		int n,m;
		cin>>n>>m;
		int a[50000];
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		int left=0;
		int num=0;
		int right =0;
		for(right=0;right<n;right++){
			while(abs(a[right]-a[left])>m){
				int len=right-left+1;
				if(len>num) num=len;
				left++;
			}	
		}	
		if(right==n&&left==0) num=n;
		cout<<num<<endl;
	}
	return 0;
}

题目E:最长子串

题目描述
给一个只包含小写字母且长度不超过100000的字符串,找出每个字母恰好出现两次的最长子串。
输入
第一行是一个正整数T,表示数据组数。每组数据包括一行,包含一个字符串
输出
对每组数据,输出符合要求的最长子串的长度。

样例输入

2
abbccdde
abcedfg

样例输出 

6
0

个人题解

#include <iostream>
#include<string>
using namespace std;
int main(){
	int T;
	cin>>T;
	while(T--){
		string s;
		cin>>s;
		int n=s.length();
		int left=0;
		int num=0;
		int right =0;
		for(right=0;right<n;right++){
			while(s[left]!=s[left+1]){
				left++;
			}
			while(s[right]!=s[right+1]){
			int len=right-left;
			if(len>num) num=len;
			break;	
			}	
		}	
		if(right==n&&left==0) num=n;
		cout<<num<<endl;
	}
	return 0;
}

总结:这次预推免机试比夏令营难度小很多,本人也勉强过了五道题的小样本,但是最后一题应该有点问题。

后续:本人菜鸡了属于是,没进面试 ,gg

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星蓝_starblue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值