校内OJ 4765 bestJob(分类讨论)

传送门

【题目分析】

细节打挂一堆。。。。。。。。。

其实还挺好想的。。。。

先将每个人的答案字符串转为二进制数,0表示N,1表示Y。

分情况讨论如下:

1.k1=0,k2=0

全是第三类人的话,只用满足答案对应的二进制串没有出现过,这个用map就能维护,注意枚举要到最大值,但因为不同的串和反串最多100个,所以不用枚举多少就能找到答案。

2.k1!=0,k2!=0

两种人都有,那么两个答案异或的结果一定是(1<

3.k1=0,k2!=0或者k1!=0,k2=0

方法与上面那种一样,但需要保证选的串的反串未出现过。

【代码~】

#include
using namespace std;
typedef long long LL;
const LL MAXN=51;

LL n,m,k1,k2;
map mp;
LL a[MAXN];
LL a1[MAXN][MAXN];
char ans[MAXN];
LL que1[MAXN],top1,que2[MAXN],top2;

int main(){
//	freopen("bestjob.in","r",stdin);
//	freopen("bestjob.out","w",stdout);
	scanf("%lld%lld%lld%lld",&n,&m,&k1,&k2);
	LL tmp=(1ll< s;
	for(LL i=1;i<=n;++i){
		if(!s.count(a[i])){
			if(mp[a[i]]==k1)  que1[++top1]=a[i];
			if(mp[a[i]]==k2)  que2[++top2]=a[i];
		}
		s.insert(a[i]);
	}
	sort(que1+1,que1+top1+1);
	sort(que2+1,que2+top2+1);
	LL flag=0;
	if(!k1&&!k2){
		for(LL i=0;i<=tmp;++i){
//			cout<

 

你可能感兴趣的:(————基础算法————,模拟)