蔚来7.21笔试
第一题添数博弈
#include <bits/stdc++.h>
using namespace std;
int getNum(int x,int y){
int z = y;
while(x%y){
z = x%y;
x = y;
y = z;
}
return z;
}
int main(){
int n;
int x,y;
for(int i=0;i<n;++i){
cin>>x>>y;
int maxNum = max(x,y);
int minNum=min(x,y);
if((maxNum/getNum(maxNum,minNum))%2==0){
cout<<"B"<<endl;
}else{
cout<<"A"<<endl;
}
}
return 0;
}
/*测试用例
2
4 1
5 2
*/ 第二题:思路为将该问题转化为背包问题进行求解#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<std::tuple<int, int, int>> num;
int x, y, z;
vector<int>a(n);
vector<int>b(n);
vector<int>c(n);
int ans = 0;
for (int i = 0; i < n; ++i) {
cin >> a[i];
ans += a[i];
}
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
for (int i = 0; i < n; ++i) {
cin >> c[i];
}
for (int i = 0; i < n; ++i) {
num.push_back({ a[i],b[i]-a[i],c[i] });
}
sort(num.begin(), num.end(), [&](tuple<int,int,int>& a, tuple<int,int,int>& b)
{
return get<1>(a) > get<1>(b);
}
);
a.clear();
a.resize(k+1,0);
for (int i = 0; i < n; ++i) {
for (int j = k; j >= get<2>(num[i]); --j) {
/*问题转化为背包问题,即求(作弊-不作弊)的最大值,weight即为c[i],价值为b[i]-a[i]*/
a[j] = max(a[j], a[j - get<2>(num[i])]+get<1>(num[i]));
}
}
int res = a[k] +1500+ans;/*最后直接加上不作弊的积分总和即可*/
cout << res;
return 0;
}/*
5 3
1 2 5 10 7
20 10 20 11 -4
3 1 1 1 2
*/
第三题:leetcode629变种题,区别是最后求解时,累加1~k的数组和
#蔚来笔试##蔚来提前批笔试#
查看22道真题和解析