//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!!!
一次高昂的学费
时间: 2024-10-28 15:02:00