第一题:找到最接近0的数字
思路:用一个数表示到0之间的距离
代码:
class Solution {
public:
int findClosestNumber(vector<int>& nums) {
int res = -1e7, m = 1e7; //res为数字,m为到0的距离
for(int i : nums){
if(fabs(i) < m){
m = fabs(i);
res = i;
}
else if(fabs(i) == m)
res = max(res, i);
}
return res;
}
};
第二题:买钢笔和铅笔的方案数
思路:暴力模拟
代码:
class Solution {
public:
long long waysToBuyPensPencils(int total, int cost1, int cost2) {
long long res = 0;
for(int i = 0; i * cost1 <= total; i ++){
int j = (total - i * cost1) / cost2;
res += j + 1;
}
return res;
}
};
第三题:设计一个ATM机器
思路:用数组来实现,一个数组来表示钱的数额,一个表示每一个数额有的的数量,一个数组来代表数额的数量进行操作,还有一个数组来表示被取掉的每一个数额的数量,第三个数组我原本是想在函数中定义的但是超内存了,还有一个坑就是表示每一个数额有的数量会爆int
代码:
class ATM {
public:
vector<long long> ans, temp;
vector<int> cnt;
vector<int> m = {20, 50, 100, 200, 500};
ATM() {
ans.resize(5);
}
void deposit(vector<int> banknotesCount) {
for(int i = 0; i < 5; i ++) ans[i] += banknotesCount[i];
}
vector<int> withdraw(int amount) {
temp = ans;
cnt.resize(5);
for(int i = 0; i < 5; i ++) cnt[i] = 0;
for(int i = 4; i >= 0; i--){
if(amount >= m[i]){
int ct = amount / m[i];
if(ct >= temp[i]){
amount -= temp[i] * m[i];
cnt[i] = temp[i];
temp[i] = 0;
}
else{
amount -= ct * m[i];
cnt[i] = ct;
temp[i] -= ct;
}
}
}
if(amount) return {-1};
ans = temp;
return cnt;
}
};
/**
* Your ATM object will be instantiated and called as such:
* ATM* obj = new ATM();
* obj->deposit(banknotesCount);
* vector<int> param_2 = obj->withdraw(amount);
*/
第4题:节点序列的最大得分
思路:从中间的边开始向两边枚举,例如a-x-y-b以x和y两个点为主整体在x和y相邻的点开始枚举找到最大值
代码:
class Solution {
public:
int maximumScore(vector<int>& scores, vector<vector<int>>& edges) {
int n = scores.size();
vector< vector< pair<int, int> >> ans(n); //ans存储每个点相邻的点和其权值和
//读取
for(auto i : edges){
int x = i[0], y = i[1];
ans[x].push_back({scores[y], y});
ans[y].push_back({scores[x], x});
}
//当长度等于3时只能去前3个,为了防止超时,注意要加&因为对数组进行了修改
for(auto &i : ans){
if(i.size() > 3)
{
sort(i.begin(), i.end(), [](const pair<int, int> &a, const pair<int, int> &b){ return a.first > b.first; });
i.resize(3);
}
}
int res = -1;
//从中间开向两边枚举
for(auto i : edges){
int x = i[0], y = i[1];
for(auto i : ans[x]){
for(auto j : ans[y]){
if(i.second != y && i.second != j.second && j.second != x)
res = max(res, scores[x] + scores[y] + i.first + j.first);
}
}
}
return res;
}
};
总结:其实我认为这次的周赛还是挺简单的(前三题),但是因为第三题没有仔细看题目,导致我写了很久,以后一定要先把题目看三遍再开始写。