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;
}
上一篇:Entity Framework Code First 映射


下一篇:nodejs——网络编程模块