本文主要是介绍卡码网笔试题 | 114 小欧的平均数、115 组装手机、116 小欧的卡牌,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
114 小欧的平均数
这题审题要仔细一些,注意题目的真正意思其实是要我们确定三个数的奇偶性,当其中两个分别为一个奇数一个偶数时,我们可以调整第三个数,之后切换到可以匹配的状态下再次调整刚才那两个数中的一个。而不是找到加起来为偶数的两个数,将剩余一个数调整到和平均数一样的大小。
所以其实统计三个数奇偶性就行了。如果都是奇数或者都是偶数刚好满足条件,不用调整。否则一奇数两偶数,或者一偶数两奇数,都只需要调整一步就可以了。这种题目就是审题难了点。懂了之后写代码很简单。
#include <iostream>
using namespace std;int main() {int x, y, z;cin >> x >> y >> z;int count = 0;if (x % 2 == 0) count++;if (y % 2 == 0) count++;if (z % 2 == 0) count++;if (count == 0 || count == 3) cout << 0 << endl;else cout << 1 << endl;}
115 组装手机
这题审题也有坑。当外壳价格有相同的时候,其实不用全部去除,可以保留着和内部零件匹配。但是也只能匹配其中较小个数的手机数,不能直接相乘。所以用两数相加的思路来做,先用set记录所有种类手机的价格,并去重。之后每一个价格分别两数相加,用map记录外壳价格和个数,再去循环看有多少零件满足要求。能很好地解决这个问题。为了这个答案,我和鱼聪明AI聊了半天。最后参考了别人的题解。得出了如下代码。
#include <bits/stdc++.h>
using namespace std;int main(){int n;while(cin>>n){vector<int> a(n);vector<int> b(n);for(int i = 0; i<n; i++) cin>>a[i];for(int i = 0; i<n; i++) cin>>b[i];unordered_set<int> st;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){st.insert(a[i]+b[j]);}}int res = 0;for(int sum: st){int tmpmax = 0;unordered_map<int,int> mp;for(int i = 0; i<n; i++)mp[sum - a[i]]++;for(int i = 0; i<n; i++){if(mp.count(b[i]) && mp[b[i]]>0){tmpmax++;mp[b[i]]--;}}res = max(res, tmpmax);}cout<<res<<endl;}return 0;
}
116 小欧的卡牌
这题一开始就想回溯暴力枚举了。可惜超时了。后面调整到数学规律+动规上了。需要注意的是要对每两个输入进行具体的判断和逐步累加。以及每个输入都要模三,不模三最后结果会很奇怪。
代码如下:
#include <iostream>
#include <vector>
using namespace std;const int mod = 1000000000 + 7;int main() {int n;cin >> n;int a[n], b[n];for (int i = 0; i < n; i++) {cin >> a[i] >> b[i];}vector<int> dp(3, 0);vector<int> new_dp(3, 0);dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = 0; j < 3; j++) {new_dp[j] = (dp[(j - a[i-1]%3 + 3) % 3] + dp[(j - b[i - 1]%3 + 3) % 3]) % mod; }dp = new_dp;}cout << dp[0] << endl;
}
这篇关于卡码网笔试题 | 114 小欧的平均数、115 组装手机、116 小欧的卡牌的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!