首页 > 编程语言 >「ACM 算法实践」[解题报告]沙滩拾贝

「ACM 算法实践」[解题报告]沙滩拾贝

时间:2023-03-22 17:35:30浏览次数:40  
标签:cnt 拾贝 int ACM -- 解题 vec ans choose

分析

因为是与运算,只有当这 \(m\) 个数的第 \(k\) 位上都是 \(1\) 的时候才能使得最后的数的第 \(k\) 位为 \(1\) 。

为了让最后的开心程度最大,我们优先将高位取 \(1\) ,也就是从高位开始枚举,选出数量大于 \(m\) 同时在第 \(k\) 位上为 \(1\) 的所有数,然后再以同样的方法从这些数中选取第 \(k - 1\) 位为 \(1\) 的数,依次选取下去直到可选取的数的数量等于 \(m\) 。

代码

#include <bits/stdc++.h>
using namespace std;

int gi() {
	char c = getchar(); int x = 0, f = 1;
	for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
	for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
	return x * f;
}

const int N = 1e5 + 5;

int n, m, ans;
int a[N], b[N], cnt[35];
bool vis[N][32];

vector <int> vec[35];

void choose(int k, int num) {
	ans += (1 << k);
	if (num == m) return;
	for (int i = k - 1; i >= 0; --i) {
		vec[i].clear();
		cnt[i] = 0;
		for (int j = 0; j < cnt[k]; ++j)
			if ((vec[k][j] >> i) & 1) {
				vec[i].push_back(vec[k][j]);
				cnt[i]++;
			}
	}
	for (int i = k - 1; i >= 0; --i)
		if (cnt[i] >= m) {
			choose(i, cnt[i]);
			break;
		}
}


int main() {
	n = gi(), m = gi();
	for (int i = 1; i <= n; ++i) a[i] = gi();
	for (int i = 30; i >= 0; --i)
		for (int j = 1; j <= n; ++j)
			if ((a[j] >> i) & 1) {
				vec[i].push_back(a[j]);
				cnt[i]++;
			}
	for (int i = 30; i >= 0; --i)
		if (cnt[i] >= m) {
			choose(i, cnt[i]);
			break;
		}
	printf("%d", ans);
	return 0;
}

标签:cnt,拾贝,int,ACM,--,解题,vec,ans,choose
From: https://www.cnblogs.com/huangliwen/p/17244823.html

相关文章

  • 「解题报告」ARC128F Game against Robot
    好厉害的题。震撼到了。大部分参考Atcoder计数乱做-苹果蓝17。我的观察能力还是太差,一点条件都观察不出来,连\(p\)固定怎么做都不会。下面令\(n\gets\frac{n}{2......
  • 剑指 Offer 07. 重建二叉树(java解题)
    目录1.题目2.解题思路个人思路3.数据类型功能函数总结4.java代码1.题目输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍......
  • 「解题报告」ARC128E K Different Values
    我还是很菜啊。先考虑判定问题。考虑先找出一些显然的必要条件。记\(m=\suma_i\)。那么我们首先对\(m\)进行分块,每\(k\)个一块,设块数为\(p\),最后一个块的大小为......
  • 「解题报告」ARC128D Neq Neq
    我果然还是适合做这种简单数数,难的我根本不会做,哈哈!首先我们发现,如果有两个完全相同的相邻的数,那么这两个数中的每一个数都不能够被删除,那么这实际上把整个序列分成了若干......
  • cf1774f解题报告
    MagicianandPigs分析一下三个操作分别干了些什么新添一只猪使血量为\(x\)的猪血量变为\(\max(x-v,0)\)设前面操作后猪总共会受到\(s\)的伤害,复制一只血量为\(......
  • 关于ACM中-由AWS颁发的证书过期前的自动更新说明-及注意事项
    在aws的ACM-(AmazonCertificateManager )中,证书除了可以自己导入,也可以使用AWS颁发,如下图所示,可以看到证书类型当然今天笔者讲述关于使用了AWS颁发证书的,快要到期的时......
  • 关于AWS-ACM-自己导入型Imported-证书的更新替换
    在AWS中,ACM即AmazonCertificateManager的意思,是用来存储管理证书的一个服务ACM的证书有两种类型、一种是由AWS颁发的证书,另一种还可以将自己的证书导入进来,进行管理......
  • 「解题报告」ARC130E Increasing Minimum
    想法大概差不多,但是确实不知道咋维护(考虑每次删最小值的过程,我们相当于先删掉所有最小值\(=1\)的位置,然后删所有最小值\(=2\)的位置,依次类推。那么我们可以将删除的......
  • 「解题报告」ARC132F Takahashi The Strongest
    不会FWT的真实。需要重写篇FWT博客。考虑Takahashi获胜当且仅当Aoki和Snuke选的相同,Takahashi选的是它的下一个。至少有一个相等,可以容斥为所有的都不相等。......
  • ACM预备队-3月集训
    1.P8605[蓝桥杯2013国AC]网络寻路题目链接:P8605[蓝桥杯2013国AC]网络寻路-洛谷|计算机科学教育新生态(luogu.com.cn)分析:我们的做法是记录所有点的度,然后......