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;
}
标签:AtCoder,int,题解,ll,vis,flag,109,236,配对 来源: https://blog.csdn.net/hvbgff/article/details/122673688