【ACM - 2017四川省赛】F. Simple Algebra(特判)

题目描述

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 在实数域进行变化的时候,初步分析都会出现负值(未证实哈,只是简单分析得到的 ^_^ )

AC代码

#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指正。有好的题解也可以贴出来,学习学习 ^_^

你可能感兴趣的:(ACM,ACMer)