首页 > 代码库 > 一次高昂的学费

一次高昂的学费

//http://main.edu.pl/en/archive/oi/20/tak
#include <iostream>#include <algorithm>#include <cstdio>using namespace std;typedef long long LL;#define rep(i,n) for (LL i=1,n__=n;i<=n__;i++)#define repb(i,b,n) for (LL i=b,n__=n;i<=n__;i++)LL d,m,n;const LL mN=1000000+10;LL a[mN];int main(){// freopen("tak9a.in","r",stdin);// freopen("9a.out","w",stdout); cin>>d>>m>>n;// cout<<d<<‘ ‘<<m<<‘ ‘<<n<<endl; rep(i,n) cin>>a[i]; sort(a+1,a+1+n); bool can=true; LL ans=0; LL ren=-m; if (a[n]<d-m) { can=false; goto ianss;//首先是这里,由于我已经把can搞成false了,我想怎么搞最后都会输出0。。。但im无初值RE了就挂了 }        // LL im; rep(i,n) if (a[i]>=d-m) { im=i; break; } LL i; for (i=n;i>=1;i--) {// cout<<"i="<<i<<"\‘ren="<<ren<<endl; if (i==im) { if (ren*2>=((d-m)-a[im])) { ans=n-i+1; break; } continue; } if (a[i]+ren>=0)//其次是这个if,由于我在第一遍写的时候写了这个,脑海里一直觉得没什么了问题了,于是就没管了 ren=ren*2+a[i]; if (i>im) { if (ren>=d-m) { ans=n-i+1; break; } } else if (ren*2>=((d-m)-a[im])) { ans=n-i+1; break; } if (ren>=0) ren=0; }// cout<<n<<‘ ‘<<i<<endl;// for (LL j=n;j>=i;j--)// cout<<a[j]<<endl; ianss: if (can && ans>0) cout<<ans<<endl; else cout<<0<<endl;// cout<<n<<endl;// for (int i=1;i<=n;i++)// cout<<a[i]<<endl; return 0;}

这两个错误都有一个共同点,就是觉得虽然结果已定,但觉得后面肯定不会出问题,于是没写特判,放着不管,导致了严重的错误。

1.任何不确定的情况,写特判。然后做剩下的情况,虽然代码可能会变丑,但可读性和准确性都得到了提高。

fight!!!