Skip to main content

第288场周赛

按奇偶性交换后的最大数字

向表达式添加括号后的最小结果

思路

暴力模拟

  1. 先找加号位置
  2. 用双指针代替括号的位置,分割字符串
  3. 写一个计算子串的函数,方便后面使用
  4. 全部转成int计算
  5. 存哈希表
  6. 求value最小的key

代码

class Solution {
public:

int get_value(string e) {

int res = 0, t;
for (int i = 0; i < e.size(); i++) {
res = res * 10 + (e[i] - '0');
if (e[i + 1] == '+') t = res, res = 0, i++;
}

return res + t;
}
static bool cmp_value(const pair<string, int> left, const pair<string,int> right)
{
return left.second < right.second;
}

string minimizeResult(string expression) {
unordered_map<string, int> m;
int len = expression.size(), pos;
int minr = 0x3f3f3f3f;
for (int i = 0; i < len; i++) if (expression[i] == '+') pos = i;

for (int i = 0; i < pos; i ++) {
for (int j = len - 1; j >= pos + 1; j --) {
string a = expression.substr(i, j - i + 1);
string front = expression.substr(0, i);
string back = expression.substr(j + 1, len - j + 1);

int t = get_value(a);
int f = atoi(front.c_str());
int b = atoi(back.c_str());

int ans;
if(f == 0 && b == 0) ans = t;
else if (f == 0) ans = t * b;
else if (b == 0) ans = f * t;
else ans = f * t * b;

string tmp = front + "(" + a + ")" + back;
cout << tmp << endl;
m[tmp] = ans;
}
}
auto i = min_element(m.begin(), m.end(), cmp_value);

return i->first;
}
};

K 次增加后的最大乘积

思路

从样例可以找到规律,只要使得数组当中的每个数都接近相等这个值就是最大的,也就是贪心。可以使用优先队列来修改数。每次都修改那个最小的数,然后重新加入到优先队列里即可。

代码

class Solution {
public:
int maximumProduct(vector<int>& nums, int k) {
priority_queue<int, vector<int>, greater<int>> heap;

for (int i = 0; i < nums.size(); i++) {
heap.push(nums[i]);
}

for (int i = 0; i < k; i++) {
int t = heap.top() + 1;
heap.pop();
heap.push(t);
}

long long res = 1;
while (!heap.empty()) {
int t = heap.top();
heap.pop();
res = (res * t) % 1000000007;
}
return res;
}
};

花园的最大总美丽值