笔试强训day31

小红的口罩

疫情来了,小红网购了 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值