Given function f(x, y) = ax*x + bxy + cy*y, check if f(x, y) ≥ 0 holds for all x, y ∈ R.
Input
The input contains zero or more test cases and is terminated by end-of-file.Each test case contains three integers a, b, c.
• −10 ≤ a, b, c ≤ 10
• The number of tests cases does not exceed 104
.
Output
For each case, output “Yes” if f(x, y) ≥ 0 always holds. Otherwise, output “No”.
Sample Input
1 -2 1
1 -2 0
0 0 0
Sample Output
Yes
No
Yes
这道题目描述也很简单,很容易读懂题目的意思:给定表达式 f(x,y), x、y都属于实数集,输入各项系数 a,b,c 判断表达式的值是否非负。(很容易读懂对吧?)
我们看下数据规模:
a,b,c都很小,
样例数为10000
从数据规模来看,显然用打表的方式是可以完成的。
大家可以看下dalao的Sichuan 2017 FSimple Algebra(打表)
我这里呢就如标题所写,采用特判。
特判,顾名思义,就是按照输入,特别判定
对于 f(x,y) = ax*x + bxy + cy*y来说,x,y都是自变量,两个纬度的变化显然不适合我们去处理规律卅,那么我的方式其实就是降一个维度来分析。
那么如何降维度,哈哈哈,那就是减少一个自变量卅 ^_^
如何减?显然不能直接除或者什么的,那么我们可以从系数下手,并且系数就是输入(试想一下,如果输入的 a = 0, b = 0 的情况,是不是就相当于原式为 f(x,y) = cy*y了,这里只是打个比方啦 ^_^)
特判开始啦——————————————————–
1、当 a < 0 时,此时存在当 x 处于无穷大时,那么 ax*x则是负的无穷大,那么在 y 进行变化的时候,必定会存在表达式为负的情况
2、当 a == 0 时,f(x,y) = bxy +cy*y ,这种情况下,当 b == 0 时,f(x,y) = cy*y,那么此时的表达式的值则取决于 c 的取值; 当 b != 0 时,f(x,y) = bxy + cy*y ,此时,必定会存在小于 0 的情况(别忘了 x 可是要变化的哟)
3、当 a > 0 时,ax*x 则必定是非负的,那么我们将这一部分看作是常数来看待,可以得出 f(x,y) = cy*y + bxy +T(常数T),在这种情况下,是不是看出来这种情况有点像简单的一元二次方程,那么我们来 分析下一元二次方程判定是否有零点,是 b*b - 4ac 对吧? 此处已知了 a > 0, 显然 b * b是非负的,那么这个式子简单分析下,当 c < 0,是不是一定会保证 b * b - 4ac一定为正,其他情况是不是都可能会出现 b * b - 4ac 小于或等于0。 那么我们联想下 ,当 b*b - 4ac <= 0 ,是不是意味着 c 必须大于等于0(c等于0时,b也必须等于0),对应于一元二次方程来说,这种情况下无解,对应于此时的 f(x,y) 来说,既然无零点,而且a 和 c均是大于等于零的,那么此时必定不会存在负数值的情况;而对于 b * b - 4ac > 0 的情况,在 x ,y 在实数域进行变化的时候,初步分析都会出现负值(未证实哈,只是简单分析得到的 ^_^ )
#include
using namespace std;
int main(){
int a,b,c;
while(cin>>a>>b>>c){
if(a < 0){
cout<<"No"<else if(a == 0){
if(b == 0){
if(c>=0){
cout<<"Yes"<else{
cout<<"No"<else{
cout<<"No"<else{
if(b*b - 4*a*c <= 0){
cout<<"Yes"<else{
cout<<"No"<return 0;
}
PS:如果错误,欢迎dalao指正。有好的题解也可以贴出来,学习学习 ^_^