《看了受制了》第三十八天,8道题,合计210道题

2023年10月9日

Div.2 Round902 C Joyboard

题目大意

0m中有多少个数,可以满足以下式子:
m%n=p

p%(n1)=p2

p2%(n2)=p3
...
Pn1%1=0
而且m,p1,p2,...,0,中恰好有k个值。

题目理解

我们经过思考后,可以得出以下的条件:

  • k大于3后无解
  • k等于1时,m只能等于0
  • k等于2时,有两种可能
  1. mn时,取大于n的值必为3种(n的倍数除外)
  2. m<n时,1 ~ m都可
  • k等于3时,有两种可能
  1. mn时,无解,不可能出3种,最多两种
  2. m>n时,一定是(n + 1 ~ m)且,去掉m的倍数

代码实现

void solve()
{
	int n, m, k;

	cin >> n >> m >> k;

	if(k == 1) cout << 1 << endl;
	else if(k == 2)
	{
		if(m >= n) cout << n - 1 + (m / n) << endl;
		else cout << m << endl;
	}else{

		if(m < n)
			cout << 0 << endl;
		else
			cout << (m - n) - m / n + 1 << endl;
	}
	

	return;
}

Div.2 Round899 B Sets and Unino

题目大意

构造一个,所有的集合并集,小的集合,且这个集合最大。

题目理解

枚举,删除每一个集合元素后,构造出来的集合大大小,取最大值即可

代码实现

const int N = 60;
int cnt[N], a[N][N];
void solve()
{

	int n;
	cin >> n;

	vector<int> vec;
	for(int i = 0; i < n; i++)
	{
		cin >> cnt[i];

		for(int j = 0 ; j < cnt[i]; j++)
		{
			cin >> a[i][j];
			vec.push_back(a[i][j]);
		}
	}

	sort(vec.begin(), vec.end());
	vec.erase(unique(vec.begin(), vec.end()), vec.end());
	int res = 0;

	for(int i = 0; i < (int)vec.size(); i++)
	{
		int t = vec[i];
		set<int> tmp;
		for(int j = 0; j < n; j++)
		{
			bool flag = true;
			for(int k = 0; k < cnt[j]; k++)
				if(a[j][k] == t)
					flag = false;

			if(flag)
				for(int k = 0; k < cnt[j]; k++)
					tmp.insert(a[j][k]);
		}
		res = max(res, (int)tmp.size());
	}

	cout << res << endl;

	return;	
}

Div.2 Round899 C CardGame

题目大意

可以拿奇数的牌,和偶数的牌,奇数直接加,偶数不加。问拿牌的最大和。

题目理解

我们其实所有的整数都可以拿。因为奇数位的整数直接拿就行,偶数位的整数,我们可以选择拿掉一个最前面的偶数位,然后把所有的偶数位就变成了奇数位,然后比较一下:
比较,拿偶数位的好,还是把第一位也拿走,这样如果第二位是正数,也可以拿到了

代码实现

void solve()
{

	ll res = 0;
	ll n;
	cin >> n;
	vector<ll> vec(n);

	for(int i = 0; i < n; i++)
	{
		cin >> vec[i];
		if(vec[i] > 0) res += vec[i];
	}

	if(n < 2){
		cout << res << endl;
		return;
	}
	else if(vec[0] < 0 && vec[1] > 0) res = max(res - vec[1], res + vec[0]);
	cout << res << endl;
	return;
}

Div.2 Round897 A green_gold_dog, array and permutation

题目大意

给了a数组,和b数组,要构建一个c数组,让它的数量最大。
ci=aibj 这个j可以从1n中任取。

题目理解

我们可以证明让最小的值减第一大的b,第二小的a减第二大的b。即:
越小的值让他更小。那么就一定会是最优解。

代码实现

const int N = 4e4 + 10;
int b[N];
void solve()
{

	int n;
	cin >> n;
	vector<PII> a(n);
	for(int i = 0; i < n; i++){
		cin >> a[i].x;
		a[i].y = i + 1;
	}

	sort(a.begin(), a.end());

	for(int i = 0; i < n; i++)
		b[a[i].y] = n - i;

	for(int i = 1; i <= n; i++)
		cout << b[i] << " ";

	cout << endl;
	return;
}

Div.3 Round874 A Musical Puzzle

题目大意

问一个字符串至少需要多少个长度为2的连续的字符串构成.

题目理解

因为字符串是ab+bc=abc那么我们只需要统计,s[i] + s[i + 1]能形成的种类即可

代码实现

void solve()
{

	int n;
	cin >> n;
	string s;
	cin >> s;

	set<string> st;

	for(int i = 0; i < (int)s.size() - 1; i++)
	{
		string a(1, s[i]);
		string b(1, s[i + 1]);

		string c = a + b;
		st.insert(c);
	}

	cout << st.size() << endl;

	return;
}

Div.3 Round874 B Restore weather

题目大意

给了两组数和k,让后让两两做差,让他们的差不超过k

题目理解

利用刚才的越小的数减去越大的数会越小,那么我们只有减去尽可能小的数才会变化更小。所以我们就小数减小数,大数减大数,就不会超过k,如果第一个小数减小数都超过k了,那其他必然超过

代码实现

void solve()
{

	int n, k;
	cin >> n >> k;

	vector<PII> a(n);
	vector<int> b(n), c(n);

	for(int i = 0; i < n; i++)
	{
		cin >> a[i].x;
		a[i].y = i;
	}

	sort(a.begin(), a.end());


	for(int i = 0; i < n; i++) cin >> b[i];

	sort(b.begin(), b.end());
	for(int i = 0; i < n; i++)
		c[a[i].y] = b[i];

	for(int i = 0; i < n; i++)
		cout << c[i] << " ";

	cout << endl;

	return;
}

Div.3 Round874 C Vlad Building Beautiful Array

题目大意

能否用b构造出一个数组c,使得c中所有数都是整数。且全是偶数或,都是奇数。c可以用bibj构造数组

题目理解

如果存在奇数,一定得是最小的,才能把所有数变成奇数
如果不存在奇数,那就都是偶数不用变

代码实现

void solve()
{

	int n;
	cin >> n;

	vector<int> a(n);
	int k = INF;
	bool flag = false;
	for(int i = 0; i < n; i++)
	{
		cin >> a[i];
		if(a[i] % 2)
		{
			k = min(k, a[i]);
			flag = true;
		}
	}

	if(!flag) cout << "YES" << endl;
	else{
		sort(a.begin(), a.end());

		if(a[0] != k) cout << "NO" << endl;
		else cout << "YES" << endl;
	}
	return;
}

Div.3 Round867 A TubeTube Feed

题目大意

他有多个电视频道,每个频道有个持续时间和好玩程度。问,他在t秒内能看到最好玩的电视是哪个?
他从第一个电视就开始看,每换台需要一秒。

题目理解

我们直接枚举,切换到这个台且这个台的持续时间是否小于等于t,且好玩度是不是高的,记录答案即可

代码实现

void solve()
{

	int n, s;
	cin >> n >> s;

	vector<PII> q(n);

	for(int i = 0; i < n; i++)
		cin >> q[i].x;

	for(int i = 0; i < n; i++)
		cin >> q[i].y;

	int val = 0, idx = -1;

	for(int i = 0; i < n; i++)
		if(q[i].x + i <= s && val < q[i].y)
			idx = i + 1, val = q[i].y;

	cout << idx << endl;
	return;
}
posted @   wxzcch  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示