目录
1.压缩字符串
2.chika和蜜柑
3.01背包
1.压缩字符串
链接
注意细节:
1.数量为一个时不用输出个数
2.当数量超过 9 时,需要逐个拿出 n 的位数,如153次,需要拿出1、5、3三个数
详细代码:
class Solution {
public:int Check(int x) {int cnt = 0;while (x) {x /= 10;cnt++;}return cnt;}string compressString(string param) {string ret;for (int i = 0; i < param.size(); ++i) {int tmp = param[i];int cnt = 0;while (param[i] == tmp) {cnt++;i++;}ret += tmp;if (cnt > 1) {int n = Check(cnt);if (n > 1) {while (cnt) {int i = pow(10, n - 1);ret += cnt / i + '0';cnt %= i;n--;}if (n){ret += '0';n--;}}else if (n == 1){ret += cnt + '0';}}i--;}return ret;}
};
2.chika和蜜柑
链接
经典的TopK问题,取头几个最大甜度,注意排序逻辑:
比较规则是:首先比较第二个元素的值,如果它们不相等,则按照第二个元素的值从大到小排序;如果第二个元素的值相等,则按照第一个元素的值从小到大排序。
sort(arr, arr + n, [&](const PII& a, const PII& b)
{
if (a.second != b.second)
return a.second > b.second;
else
return a.first < b.first;
});
详细代码:
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
typedef pair<int, int> PII;// (酸,甜)
const int N = 2e5 + 10;
PII arr[N];signed main()
{int n, k;cin >> n >> k;for (int i = 0; i < n; ++i)cin >> arr[i].first;for (int i = 0; i < n; ++i)cin >> arr[i].second;sort(arr, arr + n, [&](const PII& a, const PII& b){if (a.second != b.second)return a.second > b.second;elsereturn a.first < b.first;});int sums = 0;int sumt = 0;for (int i = 0; i < k; ++i){sums += arr[i].first;sumt += arr[i].second;}cout << sums << ' ' << sumt << endl;return 0;
}
3.01背包
链接
01背包模版题:
class Solution {
public:const static int N = 1010;int v[N];int w[N];int dp[N][N] = { 0 };int knapsack(int V, int n, vector<vector<int> >& vw) {for(int i = 0; i < vw.size(); ++i){v[i + 1] = vw[i][0];w[i + 1] = vw[i][1];}for(int i = 1; i <= n; ++i){for(int j = 1; j <= V; ++j){dp[i][j] = dp[i - 1][j];if(j - v[i] >= 0)dp[i][j] = max(dp[i - 1][j], dp[i - 1][j -v[i]] + w[i]);}}return dp[n][V];}
};