AtCoder Beginner Contest 236 A-D题解

A - chukodai

题意

使字符串第a个字符与第b个字符交换`

#include<bits/stdc++.h>
using namespace std;
int dp[109][109],a[109][109];
char c[100009];
int main()
{
	int t,i,flag,j,k,m,n,x,y,cnt,o,l,r;
    char h;
	cin>>c>>x>>y;
    h=c[x-1];
    c[x-1]=c[y-1];
    c[y-1]=h;
    cout<<c;
	return 0;
}

B - Who is missing?

题意

共有N种卡片,每种卡片有四张,输入4N-1张卡片,求缺少哪张卡片

#include<bits/stdc++.h>
using namespace std;
int vis[900009],a[109][109];
char c[100009];
int main()
{
	int t,i,flag,j,k,m,n,x,y,cnt,o,l,r;
    cin>>n;
    for(i=1;i<=n*4-1;i++)
    {
    	scanf("%d",&k);
    	vis[k]++;
	}
	for(i=1;i<=n;i++)
	if(vis[i]<4)printf("%d",i);
	return 0;
}

C - Route Map

题意

共有n个车站,有m个车站列车会停靠,求各个车站列车是否会停靠

#include<bits/stdc++.h>
using namespace std;
int vis[900009],a[109][109];
string s[100009];
int main()
{
	int t,i,flag,j,k,m,n,x,y,cnt,o,l,r;
    cin>>n>>m;
    string s1;
    map<string ,int>has;
    for(i=1;i<=n;i++)
    {
    	cin>>s[i];
	}
	for(i=1;i<=m;i++){
		cin>>s1;
		has[s1]=1;
	}
	for(i=1;i<=n;i++)
	{
	if(has[s[i]]==1)printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

D - Dance

题意

共有2N个人,编号为1-2N,现要人们两两配对,若编号为i的人想与编号为j的人配对,i必须小于j,i与j配对后获得亲和力B。所有人配对完成后亲和力分别为B1,B2…BN,总乐趣为B1⊕B2⊕…⊕BN。求所有配对组合中总乐趣的最大值。

做法

使用dfs搜索所有情况,因为只能找编号比自己大的人配对,所以每次先找出当前需要配对的人 flag,再从flag+1到2N中寻找当前未配对的人与flag配对。当flag等于2N时说明所有人配对完成。

#include<bits/stdc++.h>
using namespace std;
typedef  long long ll;
ll vis[909],a[109][109],n,ma=0;
void dfs(ll flag,ll val){//falg表示当前需要配对的人的编号   val表示当前总乐趣
	ll i,j;
	if(flag==n*2){
		ma=max(ma,val);
		return ;
	}
	ll fl=0,ci;
	if(vis[flag]){//若flag已经与其他人配对则寻找下一个需要配对的人
		dfs(flag+1,val);
	}
	else {
		for(i=flag+1;i<=n*2;i++){//寻找当前未配对的人与flag配对
	    if(vis[i])continue;
		vis[i]=1;
		vis[flag]=1;
		dfs(flag+1,val^a[flag][i]);
		vis[flag]=0;
		vis[i]=0;
	    }
	}
	
}
int main()
{
	ll t,i,j,k,m,x,y,cnt,o,l,r;
    cin>>n;
    for(i=1;i<=n*2-1;i++){
    	for(j=i+1;j<=n*2;j++)
    	scanf("%lld",&a[i][j]);
	}
    dfs(1,0);
	cout<<ma;
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值