F题题解,本场比赛最离谱的一件事
讲个笑话,这份代码过了。(你被骗了,这里根本没有题解)
这份代码过了倒是没啥好说的,关键是这份代码和我想写的代码是不一样的。
按照我的思路,这份代码其实是写错了的,手捏了一个hack
然后我把错误的部分改掉了,hack就过了,但是提交就WA了
也就是说,我对着错误的思路写代码,但是写错了,然后反而通过了。
这一份代码和我第一发提交的代码仅仅只差一个+1,第一发代码的提交时间为35分钟,正好和一血同时。而我在写代码的时候,中途花了15分钟左右去处理其他事情,也就是说,这把差点以一个完全错误的代码拿到了F题一血。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> a(n+1);
for(int i=2;i<=n;i++){
cin>>a[i];
}
int m = n + 1 >> 1;
for(int i=0;i<(1<<m);i++){
string s(n+1,'0');
for(int j=0;j<m;j++){
if((i>>j)&1) s[j+1] = '1';
}
auto b = a;
for(int j=n;j>=2;j--){
for(int k=n;k>j;k--){
if(s[k-j+1]=='0' && s[k]=='1') b[j]--;
}
if(b[j]==1){
if(s[1]=='0') s[j] = '1';
else goto no;
}
else if(b[j]<0 || b[j]>1) goto no;
else{
if(s[1]=='0') s[j] = '0';
else s[j] = '1';
}
}
cout<<s.substr(1,n)<<endl;
return 0;
no:;
}
cout<<-1<<endl;
}
/*
这个样例直接寄了:
4
2 2 1
*/

查看23道真题和解析