小红的口罩
疫情来了,小红网购了 nnn 个口罩。
众所周知,戴口罩是很不舒服的。小红每个口罩戴一天的初始不舒适度为 aia_iai。
小红有时候会将口罩重复使用(注:这是非常不卫生的!),每次重复使用时,该口罩的不舒适度会翻倍!
小红想知道,自己在不舒适度总和不超过 kkk 的情况下,最多能用现有的口罩度过多少天?
输入描述:
第一行输入两个正整数 nnn 和 kkk ,分别代表口罩的总数、以及小红最多能忍受的不舒适度总和。
第二行输入 nnn 个正整数 aia_iai ,用空格隔开。分别代表每个口罩初始的不舒适度。
1≤n≤105,1≤ai,k≤1091\leq n \leq 10^5, 1 \leq a_i,k \leq10^91≤n≤105,1≤ai,k≤109
输出描述:
一个整数,代表小红最多能度过的天数。
直接用堆去模拟就行了
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int n, k;
int main()
{
cin >> n >> k;
int sum = 0;
priority_queue<int, vector<int>, greater<int> >pq;
while (n--)
{
int x;
cin >> x;
pq.push(x);
}
int day = 0;
while (sum <= k)
{
int t = pq.top();
pq.pop();
sum += t;
if(sum <= k)
++day;
pq.push(t * 2);
}
cout << day << endl;
return 0;
}
春游
盼望着,盼望着,东风来了,春天脚步近了。
值此大好春光,老师组织了同学们出去划船,划船项目收费如下:
双人船最多坐两人,也可以坐一人,收费a{a}a元
三人船最多坐三人,也可以坐两人或者一人,收费b{b}b元
本次出游加上带队老师共n{n}n人,如何安排能使得花费最小呢?
输入描述:
第一行给出一个正整数 T(1≤T≤1000)T(1 \le T \le 1000)T(1≤T≤1000),代表测试数据的组数。
接下来 T{T}T 行每行给出三个正整数n,a,b,1≤n,a,b≤109n, a, b,1 \le n,a,b \le 10^9n,a,b,1≤n,a,b≤109,含义如题。
输出描述:
每组输入输出一行,代表最小的花费
#include <iostream>
using namespace std;
typedef long long LL;
LL t;
LL n, a, b;
LL fun()
{
// 边界情况
if (n <= 2) return min(a, b);
LL ret = 0;
if (a * 3 < b * 2) // 尽可能的选择双⼈船
{
ret += n / 2 * a;
n %= 2;
if (n) ret += min(min(a, b), b - a);
}
else // 尽可能的选择三⼈船
{
ret += n / 3 * b;
n %= 3;
if (n == 1) ret += min(min(a, b), 2 * a - b);
if (n == 2) ret += min(min(a, b), 3 * a - b);
}
return ret;
}
int main()
{
cin >> t;
while (t--)
{
cin >> n >> a >> b;
cout << fun() << endl;
}
return 0;
}
数位染色
小红拿到了一个正整数 � x 。她可以将其中一些数位染成红色。然后她想让所有染红的数位数字之和等于没染色的数位数字之和。
她不知道能不能达成目标。你能告诉她吗?
输入描述:
一个正整数 � x ,1≤�≤10181≤x≤1018
输出描述:
如果小红能按要求完成染色,输出"Yes"。否则输出"No"。
#include <iostream>
#include <string>
using namespace std;
const int N = 30;
bool dp[N][N];
int main()
{
string s;
cin >> s;
int sum = 0;
for (auto& c : s)
sum += c - '0';
if (sum % 2)
{
cout << "No" << endl;
}
else {
int target = sum / 2;
//选和不选,经典01背包问题
//如果选择,dp[i][j] = dp[i-1][j-s[i]+'0'];
//如果不选,dp[i][j] = dp[i-1][j];
int n = s.size();
dp[0][0] = true;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j <= target; ++j)
{
dp[i+1][j] = dp[i][j];
if (j >= s[i] - '0')dp[i+1][j] = dp[i+1][j] || dp[i][j-s[i]+'0'];
}
}
if (dp[n][target])cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}