比赛地址链接
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";
}

最低0.47元/天 解锁文章
328

被折叠的 条评论
为什么被折叠?



