在比赛过程中常常因为一些细节的疏漏而导致结果出错
而调试这些错误的时间往往占用了大量宝贵的时间(经常比写代码的时间还长TAT)
需要添加大量的调试信息到源程序中才能得到有用的信息
所以我想了一个办法利用stringstream和bitset(方便输出二进制信息)来输出方案的办法,尽量地简化上述过程
不过注意提交代码之前一定要把调试的代码都删掉
以愤怒的小鸟这道题为例:
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <sstream> 5 #include <algorithm> 6 #include <bitset> 7 using namespace std; 8 typedef double db; 9 typedef pair<db,db> P; 10 int t,n,m,f[1<<18],g[18][18]; 11 stringstream dbg[1<<18]; 12 db a,b,eps=1e-8; 13 P p[18]; 14 int dbcmp(db a) 15 { 16 return a<-eps?-1:a>eps?1:0; 17 } 18 void pre() 19 { 20 int s; 21 db x1,x2,y1,y2,x3,y3,a,b; 22 for (int i=0;i<n;i++) 23 for (int j=i+1;j<n;j++) 24 { 25 x1=p[i].first,y1=p[i].second,x2=p[j].first,y2=p[j].second; 26 if (x1==x2) continue; 27 a=(x1/x2*y2-y1)/(x1*(x2-x1)),b=y1/x1-a*x1; 28 if (dbcmp(a)>=0) continue; 29 s=(1<<i)+(1<<j); 30 for (int k=j+1;k<n;k++) 31 { 32 x3=p[k].first,y3=p[k].second; 33 if (dbcmp(a*x3*x3+b*x3-y3)==0) s+=(1<<k); 34 } 35 g[i][j]=s; 36 } 37 } 38 int main() 39 { 40 freopen("angrybirds.in","r",stdin); 41 //freopen("angrybirds.out","w",stdout); 42 scanf("%d",&t); 43 while(t--) 44 { 45 memset(f,0x7f,sizeof(f)); 46 memset(g,0,sizeof(g)); 47 scanf("%d%d",&n,&m); 48 for (int i=0;i<n;i++) scanf("%lf%lf",&a,&b),p[i]=P(a,b); 49 sort(p,p+n); 50 pre(); 51 f[0]=0; 52 for (int i=0;i<(1<<n)-1;i++) 53 { 54 int j=0; 55 while((1<<j)&i) j++; 56 for (int k=j+1;k<n;k++) 57 if (((1<<k)&i)==0) 58 { 59 if (f[i|g[j][k]]>f[i]+1) 60 { 61 f[i|g[j][k]]=f[i]+1; 62 dbg[i|g[j][k]].clear();dbg[i|g[j][k]].str(""); 63 dbg[i|g[j][k]]<<dbg[i].str()<<"->"<<bitset<5>(i|g[j][k]); 64 } 65 } 66 if (f[i|(1<<j)]>f[i]+1) 67 { 68 f[i|(1<<j)]=f[i]+1; 69 dbg[i|(1<<j)].clear();dbg[i|(1<<j)].str(""); 70 dbg[i|(1<<j)]<<dbg[i].str()<<"->"<<bitset<5>(i|(1<<j)); 71 } 72 } 73 cout<<dbg[(1<<n)-1].str()<<endl; 74 printf("%d\n",f[(1<<n)-1]); 75 } 76 }
输入样例:
3
2 0
1.41 2.00
1.73 3.00
3 0
1.11 1.41
2.34 1.79
2.98 1.49
5 0
2.72 2.72
2.72 3.14
3.14 2.72
3.14 3.14
5.00 5.00
输出方案: