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 */