1.美团2024届第一场笔试编程真题
小美的外卖订单
小美正在设计美团外卖的定价信息。已知外卖定价的规则如下:
- 每道菜有折扣价和原价。折扣价不能超过原价。
- 订单有满xx元减yy元的优惠。当购买的菜的价格总和不小于xx元时,总价格可以减yy元。“减”的价格不能超过“满”的价格。
- 满减优惠和折扣价是互斥的,当且仅当每个菜都选择了原价才可以触发满减。
- 系统会自动为客户计算最低价格的方案。
在设计定价时,原价、折扣价和满减的价格都必须是正实数。如果设计的定价发生问题,则会提示数据错误。
请使用等价划分法设计测试用例,来测试该系统的功能。
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
输入描述:
第一行输入一个正整数n,代表菜的总数。
接下来的n行,每行输入两个实数a_i和b_i,代表每道菜的原价是a_i,折扣价是b_i。
最后一行输入两个实数x和y,代表满x元可以减y元。
1<=n<=10000
数据中所有实数的绝对值不超过1000。
输出描述:
如果数据有误,则输出一行字符串"error"。
否则输出一个小数,小数点后保留2位即可。该小数代表顾客购买了全部菜各一份时,订单的总价格。
这题其实很好处理,将总和存起来,然后与满减价格比较,分别计算出满减价格和折扣价格,比较再输出,但是值得注意的是printf输出数据类型要注意,看你对printf函数了不了解了。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<double> a(n);
vector<double> b(n);
double as = 0;
double bs = 0;
for (int i = 0; i < n; ++i) {
cin >> a[i] >> b[i];
as += a[i];
bs += b[i];
if(a[i] <= 0 || b[i] <= 0 || a[i] < b[i]){
cout << "error" << endl;
return 0;
}
}
double x, y;
cin >> x >> y;
if (x <= 0 | y <= 0 || x < y) {
cout << "error" << endl;
return 0;
}
if (as > x) {
as -= y;
}
if(as>bs) printf("%.2f",bs);
else printf("%.2f",as);
}
小美的字符串匹配度
小美有两个长度为nn只包含小写字母的字符串ss和tt,小美定义“两个字符串的匹配度”为i∈[1,n]i∈[1,n]中si=tisi=ti的数量,例如"abacd"和"aabdd"的匹配度就是2。
现在你可以进行最多一次以下操作:
对于字符串tt,选择两个索引i,j(1≤i<j≤n)i,j(1≤i<j≤n),交换titi和tjtj。
小美想知道,ss和tt的最大字符串匹配度是多少?
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
输入描述:
第一行输入一个整数n(2 \leq n \leq 1000)
第二行输入一个长度为n的字符串s。
第三行输入一个长度为n的字符串t。
输出描述:
输出一个整数,s和t的最大匹配度。
暴力枚举,双循环进行交换,但是要注意,每次交换之后要将其复原,此外也要注意给变量初始化。
#include <iostream>
using namespace std;
int main() {
int n,fzd=0,temp=0;
string a,b;
cin>>n;
cin>>a>>b;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
char c=a[i];
a[i]=a[j];
a[j]=c;
for(int m=0;m<n;m++){
if(a[m]==b[m]) fzd++;
if(temp<fzd) temp=fzd;
}
fzd=0;
char c1=a[j];
a[j]=a[i];
a[i]=c1;
}
}
cout<<temp;
}
2.数组专项练习
1.若要对data类中重载的加法运算符成员函数进行声明,下列选项中正确的是?
A Data operator+(Data);
B Data operator(Data);
C operator+(Data,Data);
D Data+(Data);
这道题目选A,是一个重载运算符的题目。
运算符重载的格式:
返回值类型 operator 运算符名称 (形参表列){//TODO:}
由于是在 Data 类中对加法运算符重载,所以参数只需要一个,并且是 Data 类型。
运算完后,要得到运算后的新数据,所以返回值也是 Data 类型。
2.以下程序程序运行后的结果是( )
#include <stdio.h>
#define N 4
void fun(int a[][N], int *p) {
int i;
for (i = 0; i < N; i++) {
if (i < 3)
p[i] += a[i][i] - a[i][N - i - 2];
else
p[i] += a[i][i] - a[i][N - i];
}
}
main() {
int x[N][N] = {{3, 6, 2, 0}, {2, 8, 7, 9}, {5, 1, 7, 3}, {9, 5, 3, 7}},
y[N] = {3, 5, 8, 6}, i;
fun(x, y);
for (i = 0; i < N; i++)
printf("%d ", y[i]);
printf("\n");
}
A 4 5 8 10
B -3 -1 1 3
C 4 5 10 8
D 1 3 -1 -3
这题选择C,一个一个的代入即可。
3.下述有关虚函数和纯虚函数说法错误的是()
A 被virtual关键字修饰的成员函数,就是虚函数
B 在基类中实现纯虚函数的方法是在函数原型后加"=0",virtual void funtion1()=0
C 同时含有纯虚拟函数的类称为抽象类,它可以被实例化,但是对象不可以调用纯虚函数
D 使用纯虚函数的意义是在很多情况下,基类本身生成对象是不合情理的
这题选择C,含有纯虚函数的类是不能实例化的。
4.c/c++中,有关纯虚函数说法正确的是( )
A 子类中必须覆盖基类的纯虚函数
B 含有纯虚函数的类不能被实例化
C 子类中必须覆盖基类的虚函数
D 含有纯虚函数的类一定是抽象类
这题选BD,我只选了D,没看到是多选,还是要注意审题,注意含有纯虚函数的类是不能实例化的,而且一定是抽象类。
谢谢阅读!