AtCoder Beginner Contest 415简单题解

 比赛地址链接

https://atcoder.jp/contests/abc415/tasks

A:

遍历一遍看x是否出现在数组中,或者直接set

void solve(){
	cin>>n;
	set<int> s;
	for(int i=0;i<n;i++){
		int x; cin>>x;
		s.insert(x);
	}
	cin>>x;
	cout<<(s.count(x)?"Yes":"No")<<"\n";
}

B:

记录#出现的位置,题目限制了#一定出现偶数次,然后按题目要求打印

string s,t;


void solve(){
	cin>>s;
	vector<int> a;
	for(int i=0;i<s.size();i++) if(s[i]=='#') a.pb(i+1);
	for(int i=0;i<(int)a.size();i+=2){
		cout<<a[i]<<","<<a[i+1]<<"\n";
	}
}

C: 

考察: 状态压缩dp,

对于给定的01字符串,出现的位置为1,表示危险的

然后我们要构造一个排列顺序使其在任意的时间不会触碰到危险

n的范围是18,且字符串的总长不超过5e5

那么我们可以直接状态压缩dp

时间复杂度18*(2^18)

string str;


void solve(){
	cin>>n>>str;  str=' '+str;
	int tot=1<<n;
	vector<int> f(tot,0);
	f[0]=1;
	for(int s=0;s<tot;s++){
		if(f[s]==0) continue;
		for(int i=0;i<n;i++){
			if(s>>i&1) continue;
			int new_s=s|(1<<i);
			if(str[new_s]!='1') f[new_s]=true;
		}
	}
	
	if(f[tot-1]) cout<<"Yes\n";
	else cout<<"No\n";
}

D: &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值