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; }