A题:

方法一:一元二次方程求解,但是会有精度误差,+1个点特判一下。

#include <bits/stdc++.h>
 
using namespace std;
 
typedef unsigned long long ll;
 
ll t;
ll x,y,z;
 
int main()
{
    //freopen("in.txt","r",stdin);
    ll n;
    scanf("%lld%lld",&n,&t);
 
    ll ans = 0;
    for(ll i = 1; i <= n; i++) {
        scanf("%lld%lld%lld",&x,&y,&z);
        ll cnt;
        if(y==0&&z==0) continue;
        if(z==0) cnt = t/(x+y);
        else if(z!=0) {
            ll sq = ((x+y)-z/2)*((x+y)-z/2) + 2*z*t;
            sq = sqrt(sq) + z/2 - (x+y);
            cnt = (sq/z);
        }
         
        if((cnt+1)*(x+y)+(cnt+1)*cnt/2*z<=t)
            cnt++;
         
        ll tmp = cnt*(x+y) + cnt*(cnt-1)/2*z;
        if(t-tmp>=x) {
            ans += (t-(cnt+1)*x);
        }
        else {
            ans +=(t-cnt*x-(t-tmp));
        }
 
    }
    cout<<ans<<endl;
 
    return 0;
}
View Code

相关文章: