【今日三题】小红的口罩(小堆) / 春游(模拟) / 数位染色(01背包)

目录
- 小红的口罩(小堆)
- 春游(模拟)
- 数位染色(01背包)
小红的口罩(小堆)
- 小红的口罩
#include <iostream>
#include <queue>
using namespace std;int n, k, sum, res;
priority_queue<int, vector<int>, greater<int>> pq;int main()
{cin >> n >> k;for (int i = 0; i < n; i++){int a;cin >> a;pq.push(a);}while (sum <= k){res++;int t = pq.top();sum += t;pq.pop();pq.push(t * 2);}cout << res - 1 << endl;return 0;
}
春游(模拟)
- 春游
首先让尽可能多的人乘坐单人价更低的船,然后把剩余的人分情况讨论。
如果双人船的单人价更低,则最后可能剩一人或刚好坐满,这一个人可以选择做双人船,或三人船、或和前面两个人一起坐三人船;
同理如果三人船的单人价更低,则最后可能剩一人,两人,或刚好坐满,如果是一人则可以选择做双人船,三人船,或和前面三个人一起坐两条双人船;同理如果是两人则也可以和前面三个人一起坐三条双人船。
#include <iostream>
using namespace std;using ll = long long;
ll t, n, a, b;int main()
{cin >> t;while (t--){cin >> n >> a >> b;ll sum = 0;if (n <= 2) sum = min(a, b);else if (a * 3 < b * 2){sum += n / 2 * a;if (n % 2) sum += min(min(a, b), b - a);}else{sum += n / 3 * b;if (n % 3 == 1) sum += min(min(a, b), 2 * a - b);if (n % 3 == 2) sum += min(min(a, b), 3 * a - b);}cout << sum << endl;}return 0;
}
数位染色(01背包)
- 数位染色
#include <iostream>
#include <string>
using namespace std;string s;
int sum;int main()
{cin >> s;for (auto ch : s) sum += (ch - '0');if (sum % 2 == 0){sum /= 2;int dp[20][200] = {};int n = s.size();for (int i = 0; i <= n; i++) dp[i][0] = true;for (int i = 1; i <= n; i++){for (int j = 0; j <= sum; j++){dp[i][j] = dp[i - 1][j];if (j >= (s[i - 1] - '0')) dp[i][j] = dp[i][j] || dp[i - 1][j - (s[i - 1] - '0')];}}if (dp[n][sum]) {cout << "Yes" << endl;return 0;}}cout << "No" << endl;return 0;
}
#include <iostream>
#include <string>
using namespace std;string s;
int sum;int main()
{cin >> s;for (auto ch : s) sum += (ch - '0');if (sum % 2 == 0){sum /= 2;int dp[200] = {};int n = s.size();dp[0] = true;for (int i = 1; i <= n; i++)for (int j = sum; j >= (s[i - 1] - '0'); j--) dp[j] = dp[j] || dp[j - (s[i - 1] - '0')];if (dp[sum]) {cout << "Yes" << endl;return 0;}}cout << "No" << endl;return 0;
}
本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~
