时间2024年8月30日
所有题目 内存限制:128 MB 时间限制:1.000S
目录
题目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