Codeforces Round #661 (Div. 3)

A. Remove Smallest

题意:

给定一个序列,每次操作可以任选两个差的绝对值小于等于 1 1 1 的元素并删掉其中的较小数,问你能否通过有限次操作把序列删到只剩一个数。

排序后计算相邻数的差,只要有大于 1 1 1 的就不可能达到目标。

AC代码:
const int N = 2e5 + 50;
int n, m;
int a[N];
 
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		sd(n);
		rep(i, 1, n)
			sd(a[i]);
		sort(a + 1, a + 1 + n);
		bool flag = 1;
		rep(i, 1, n - 1)
		{
			if (a[i] == a[i + 1] || a[i] == a[i + 1] - 1)
				continue;
			else
			{
				flag = 0;
				break;
			}
		}
		if (flag)
			puts("YES");
		else
			puts("NO");
	}
	return 0;
}

B. Gifts Fixing

题意:

n n n 份礼物盒,礼物盒中又分了 a a a 类和 b b b 类的数量,为了公平,让 n n n 份礼物盒中 a a a 类的数量相同, b b b 类的数量也相同。我们可以进行三种操作来让我们完成这个任务,求最小的操作数。

分别找到 a a a 类和 b b b 类中的最小值,只要判断当前 a a a b b b 变到最小值的最大值累加即可。

AC代码:
const int N = 2e5 + 50;
int n, m;
int a[N], b[N];
 
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		int mina = inf;
		int minb = inf;
		sd(n);
		rep(i, 1, n)
		{
			sd(a[i]);
			mina = min(a[i], mina);
		}
		rep(i, 1, n)
		{
			sd(b[i]);
			minb = min(b[i], minb);
		}
		ll ans = 0;
		rep(i, 1, n)
			ans += max(a[i] - mina, b[i] - minb);
		pld(ans);
	}
	return 0;
}

C. Boats Competition

题意:

给定一个数字序列 w 1 , w 2 , … , w n w_1,w_2,…,w_n w1,w2,,wn ,从中挑选出和相等(和不确定)的二元组,问你最多能够组合出的二元组的数量。

记录每个重量出现的次数,枚举每个二元组的和,对于每个和,看看可以组成多少二元组,然后找最大值。

AC代码:
const int N = 2e5 + 50;
int n, m;
int a[N], b[N];
 
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		sd(n);
		mem(b, 0);
		rep(i, 1, n)
		{
			sd(a[i]);
			b[a[i]]++;
		}
		int ans = 0;
		rep(i, 1, 2 * n)
		{
			int res = 0;
			rep(j, 1, i - 1)
				res += min(b[j], b[i - j]);
			ans = max(ans, res / 2);
		}
		pd(ans);
	}
	return 0;
}

D. Binary String To Subsequences

题意:

给你一个长度为 d d d 01 01 01 串,要你把他分成若干个子序列,使得每个子序列都满足 0 0 0 1 1 1 交替出现,即没有相邻的 0 0 0 和相邻的 1 1 1,要你求最少能分成多少个子序列,以及每个元素分别分给哪一个子序列

用队列分别记录 0 0 0 1 1 1 出现的位置,如果前面有没用过相反的那么就加到他后面,没有的话就组成一个新序列。

AC代码:
const int N = 2e5 + 50;
int n, m;
int a[N], b[N];
char s[N];
int ans[N];
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		sd(n);
		ss(s + 1);
		int cnt = 0;
		queue<int> q[2];
		rep(i, 1, n)
		{
			int now = s[i] - '0';
			if (q[now ^ 1].size())
			{
				int tmp = q[now ^ 1].front();
				q[now ^ 1].pop();
				ans[i] = tmp, q[now].push(tmp);
			}
			else
			{
				ans[i] = ++cnt;
				q[now].push(cnt);
			}
		}
		pd(cnt);
		rep(i, 1, n)
			printf("%d%c", ans[i], i == n ? '\n' : ' ');
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值