蔚来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的数组和
#蔚来笔试##蔚来提前批笔试#