codeforces 1105E 随机化 或 折半匹配查找

本文介绍了一种使用随机化算法解决特定问题的方法。通过随机选择元素的顺序,并检查每个元素是否可以保持其状态,从而找到最大可能的解。算法在时间限制内多次运行,以寻找最优解。

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

用1分割开的连续的2中间,只有一个人能是happy的,那么我们可以计算出f[i],用二进制表示要让i happy,需要牺牲哪些人他们不能是happy的,于是又一种随机化的做法,就是随机选取的人的顺序,然后从前到后判断当前人是否还没有被牺牲,没有被牺牲直接选。网上题解有人500次随机都过了,不过我还是学习了一个按时间写法

#include<bits/stdc++.h>
#define maxl 47 

using namespace std;

int n,m,tot=0,ans;
int a[maxl];
long long f[maxl];
string s;
map<string,int> mp;

inline void prework()
{
	scanf("%d%d",&n,&m);
	int opt;long long cur;
	for(int i=1;i<=n;i++)
	{
		cur=0;
		while(i<=n)
		{
			scanf("%d",&opt);
			if(opt==1) 
				break;
			cin>>s;
			if(!mp.count(s))
				mp[s]=tot++;
			cur|=1ll<<mp[s];
			i++;
		}
		for(int j=1;j<=m;j++)
		if((1ll<<(j-1))&cur)
			f[j]|=cur;
	}
}

inline void mainwork()
{
	for(int i=1;i<=m;i++)
		a[i]=i;
	int sum;
	long long cur;
	while(1.0*clock()/CLOCKS_PER_SEC<1.75)
	{
		random_shuffle(a+1,a+1+m);
		cur=0;sum=0;
		for(int i=1;i<=m && cur!=(1ll<<m)-1;i++)
		if((cur&(1ll<<(a[i]-1)))==0)
			cur|=f[a[i]],sum++;
		if(sum>ans)
			ans=sum;
	}
}

inline void print()
{
	printf("%d",ans);
}

int main()
{
	prework();
	mainwork();
	print();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值