首页 > 其他 > 详细

题解 洛谷P2833 【等式】

时间:2019-06-10 19:25:53      阅读:109      评论:0      收藏:0      [点我收藏+]

运用暴力解方程吸氧过了这道题

通过数据范围看,要是枚举x和y只能炸掉三成的数据。

所以考虑枚举从x1到x2枚举x,通过方程移项可知y=-(ax+c)/b,再判断y是否在y1和y2之间即可。

本题本做法主要坑点:

1、a=b=0时要特判(分为c=0和c!=0两种情况)

2、y1和y2是cmath库关键字

3、注意精度问题

#pragma GCC optimize(1)    
#include<bits/stdc++.h>
#define ll long long
using namespace std;

signed main(void)
{
    ll a,b,c,ans=0;
    ll x1,x2,y_1,y_2;   //y1和y2是cmath关键字,定义这两个家伙会CE
    scanf("%lld%lld%lld",&a,&b,&c);
    scanf("%lld%lld%lld%lld",&x1,&x2,&y_1,&y_2);

    if(a==0&&b==0)  //当a=b=0
    {   
        if(c!=0)    //如果c不为0,等式根本不成立
        {  
            puts("0");
            return 0;
        }

        else if(c==0)   //如果c=0,任何一个x与y的配对都成立
        {
            ll x_1=abs(x2-x1)+1,
            x_2=abs(y_2-y_1)+1,
            xx=x_1*x_2;
            printf("%lld\n",xx);
            return 0;
        }
    }

    for(ll x=x1;x<=x2;x++)  //常规情况:ax+by+c=0=>-(ax+c)/b=y
    {
        ll axc=(a*x+c)*-1; 
        double _ax_c=axc,
        y=_ax_c/b;  //计算y值
        if(y>=y_1&&y<=y_2&&(a*x+b*(ll)y+c)==0) ans++;   //判断y是否在范围内
        //此处存在精度问题,要用y的整数范围验算判断
    } 

    printf("%lld\n",ans);
    return 0; 
}

 

题解 洛谷P2833 【等式】

原文:https://www.cnblogs.com/KGB1331/p/10999565.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!