Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 125 Accepted Submission(s): 76
1 1 1 1 1 3
13 3Hint$f_1=3,f_2=7,f_3=13,max=13,min=3$
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int main() { int t,a,b,c,left,right,min,max,cnt1,num,cnt2; scanf("%d",&t); while(t--) { scanf("%d%d%d%d%d",&a,&b,&c,&left,&right); if(a==0)//当a为0时,为一元一次函数 { min=left*b+c; max=right*b+c; if(min>max) { int n=min; min=max; max=n; } } else { double m=(-b*1.0)/(2*a); if(m<=left||m>=right)//极点在区间外 { min=left*left*a+left*b+c; max=right*right*a+right*b+c; if(min>max) { int n=min; min=max; max=n; } } else if(m>left&&m<right)//极点在区间内 { if(a>0)//开口向上,存在稳定的最小值 { if(m>0) { cnt1=m/1; cnt2=cnt1+1; min=cnt1*cnt1*a+cnt1*b+c; num=cnt2*cnt2*a+cnt2*b+c; if(num<min) min=num; } else { cnt1=m/1; cnt2=cnt1-1;//注意当极点横坐标为负值时需要往左判一个数 min=cnt1*cnt1*a+cnt1*b+c; num=cnt2*cnt2*a+cnt2*b+c; if(num<min) min=num; } if(abs(m-left)>abs(m-right)) max=left*left*a+left*b+c; else max=right*right*a+right*b+c; } else//开口向下,有稳定最大值 { if(m>0) { cnt1=m/1; cnt2=cnt1+1; max=cnt1*cnt1*a+cnt1*b+c; num=cnt2*cnt2*a+cnt2*b+c; if(num>max) max=num; } else { cnt1=m/1; cnt2=cnt1-1; max=cnt1*cnt1*a+cnt1*b+c; num=cnt2*cnt2*a+cnt2*b+c; if(max<num) max=num; } if(abs(m-left)>abs(m-right)) min=left*left*a+left*b+c; else min=right*right*a+right*b+c; } } } printf("%d %d\n",max,min); } return 0; }