论调试的技巧

在比赛过程中常常因为一些细节的疏漏而导致结果出错

而调试这些错误的时间往往占用了大量宝贵的时间(经常比写代码的时间还长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

输出方案:

 

转载于:https://www.cnblogs.com/algonote/p/7749693.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值