HDU5595(水题+数学)

***********************************************声明******************************************************

      原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

      由于各种原因,可能存在诸多不足,欢迎斧正!

*********************************************************************************************************

GTW likes math

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 800    Accepted Submission(s): 365


Problem Description
After attending the class given by Jin Longyu, who is a specially-graded teacher of Mathematics, GTW started to solve problems in a book titled “From Independent Recruitment to Olympiad”. Nevertheless, there are too many problems in the book yet GTW had a sheer number of things to do, such as dawdling away his time with his young girl. Thus, he asked you to solve these problems.

In each problem, you will be given a function whose form is like  f(x)=ax2+bx+c . Your assignment is to find the maximum value and the minimum value in the integer domain  [l,r] .
 

Input
The first line of the input file is an integer  T , indicating the number of test cases. ( T1000 )

In the following  T  lines, each line indicates a test case, containing 5 integers,  a,b,c,l,r . ( |a|,|b|,|c|100,|l||r|100 ), whose meanings are given above.
 

Output
In each line of the output file, there should be exactly two integers,  max  and  min , indicating the maximum value and the minimum value of the given function in the integer domain  [l,r] , respectively, of the test case respectively.
 

Sample Input
  
  
1 1 1 1 1 3
 

Sample Output
  
  
13 3
Hint
$f_1=3,f_2=7,f_3=13,max=13,min=3$
 

Source

题意:

     求给定区间[l,r]的整数范围内方程  f(x)=a*x*x+b*x+c的最大值和最小值,本题要求1s内解决,直接暴力枚举时间复杂度为O(l*(r-l),而整数i的范围为|i|<=100,一般不会TE,提交一下成功了,才发现是不折不扣的水题。直接贴上代码

#include<cstdio>
#define MAX 100*100*100*2

int a,b,c,l,r;

int fun(int x){
	return a*x*x+b*x+c;
}

int main()  
{  
    int l,r,t,i,maxsum,minsum;  
    scanf("%d",&t);  
    while(t--)  
    {  
        minsum=MAX;  
        maxsum=-MAX;  
        scanf("%d%d%d%d%d",&a,&b,&c,&l,&r);  
        for(i=l;i<=r;i++)  
        {  
          int tmp=fun(i);
          if(minsum>tmp)
		   	minsum=tmp;
		  if(maxsum<tmp)
			maxsum=tmp; 
        }  
        printf("%d %d\n",maxsum,minsum);  
    }  
    return 0;  
}  


当然,本题也有时间复杂度为O(1)的算法,根据数学公式规律计算,判断二次方程(当然,a=0是不是二次方程)最值点是否在[l,r]内,然后比较最多3个点最少2个点的最大值和最小值。注意取整的处理,这是本题的一个坑:无论正负数都取最接近的整数,C/C++的浮点转整型正好是这样处理的。贴上代码:

#include<cstdio>
#define MAX 100*100*100*2

int a,b,c,l,r;

int fun(int x){
	return a*x*x+b*x+c;
}

int main()
{
int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d%d%d",&a,&b,&c,&l,&r);
		int lsum=fun(l);
		int rsum=fun(r);
		
		bool flag=false;
		int msum=0;
		if(a!=0){
			int tmp;
			if(-a*b<0)
				tmp=-1.0*b/(2*a)-0.5;
			else
				tmp=-1.0*b/(2*a)+0.5;

			if((r-tmp)*(l-tmp)<=0)
			{
				flag=true;
				msum=fun(tmp);
			}
		}
		
		int minsum=lsum,maxsum=lsum;
		if(minsum>rsum)
			minsum=rsum;
		if(maxsum<rsum)
			maxsum=rsum;
		if(flag){
			if(minsum>msum)
				minsum=msum;
			if(maxsum<msum)
				maxsum=msum;
		}
		
		printf("%d %d\n",maxsum,minsum);
	}
	return 0;
}










f(x)=ax2+bx+c f(x)=ax2+bx+c




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值