【CF】Codeforces Round #810 (Div. 2) c++代码

这篇博客主要解析了两道算法题目。第一题是构造一个数组,使得每个元素ai能被其下标i整除,给出了可行的解决方案。第二题讨论了一个聚会问题,当朋友对数为奇数时,需要决定是否删除参与者以保持蛋糕数量偶数,分析了不同删除策略的影响并给出了相应算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A - Perfect Permutation

构造一个数组使得ai能被i整除的个数最少。可以知道个数至少为1,1能整除任何数,那答案可以是1吗,是可以的比如构造 2 3 4 ... 1 。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mo = 1e3;
const int N = 1e5 + 5;
void solve()
{
	int n;
	cin >> n;
	for(int i=2;i<=n;i++) cout<<i<<' ';
	cout<<1;
	cout << '\n';
	return ;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

B - Party

题意一开始没有说明确,要仔细看样例,后面比赛中也加了解释。聚会中,如果有一对朋友,这一对朋友就要吃1个蛋糕,比如a有3个朋友到场了,他会吃3个蛋糕,如果a到场了但他没有朋友,他不吃蛋糕。

所以,如果有m对朋友,m是偶数,就都可以来参加聚会。如果m是奇数,我们就要删除奇数对朋友的蛋糕,而‘不开心值’和朋友对数无关,只跟人有关,那么我们只可能删除1个人或2个人.

删掉1个人:对于所有朋友数是奇数的人,删掉这个人就可以了,我们找到“不开心值”最小的删掉。

删掉2个人:如果有一对朋友,那么删掉他们相当于删掉cnt[a]+cnt[b]-1个人,如果他们都有偶数个朋友,那么删掉这2个人相当于删掉奇数个蛋糕,结果成立。

      对于2个不是朋友的人,如果1个人的朋友值是奇数,只删一个人显然更优。

                              如果2个人的朋友都有偶数个,删掉2人后,只删掉偶数个蛋糕,结果不成立。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int mo = 1e3;
const int N = 1e5 + 5;
int n, m;
int a[N];
int ans;
int x[N], y[N];
bool cnt[N];
void solve()
{
	cin >> n >> m;
	ans = 100000006;
	memset(cnt, 0, sizeof cnt);
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		//ans += a[i];
	}
	for (int i = 1; i <= m; i++)
	{
		cin >> x[i] >> y[i];
		cnt[x[i]] = 1 - cnt[x[i]];
		cnt[y[i]] = 1 - cnt[y[i]];
	}
	if (m % 2 == 0)
	{
		cout << "0\n";
		return ;
	}
	for (int i = 1; i <= m; i++)
	{
		if ( cnt[x[i]] == 1 ) ans = min(ans, a[x[i]]);
		if ( cnt[y[i]] == 1 ) ans = min(ans, a[y[i]]);
		if ( cnt[y[i]] == cnt[x[i]] )
		{
			ans = min(ans, a[x[i]] + a[y[i]]);
		}
	}
	cout << ans << endl;
	return ;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值