zoukankan      html  css  js  c++  java
  • LuoGu P2735 电网 Electric Fences

    题目传送门

    这个东西,本来我是用求出两条一次函数解析式然后判断在x坐标下的y坐标值来做的

    首先因为没考虑钝角三角形,WA了

    然后又因为精度处理不好又WA了

    一气之下,只能去网上查了查那个皮克定理

    首先用皮克定理需要知道:在(0,0)到(n,m)这条线段上的整点个数有gcd(n,m)+1个,至于怎么证明,我没有深究(会用不就完了

    这是对于一条过原点的线段,不过原点的线段呢?我是这样理解的:我把坐标系的原点平移到了该线段的的某个端点上,以这个点的坐标为原点,把上面的式子写出来,然后......就解决了

    皮克定理:在网格点中三角形的面积: 2S = 2a + b - 2(我太懒了,复制一个吧

    其中,s表示多边形面积,a表示图形内的格点数,b为图形边界上的格点数

    然后利用推导公式(不就是逆用嘛):a=(2s-b+2)/2就行了。

    但是嘞,又是该死的精度!

    这样会造成一定的精度丢失,那怎么办?

    尽量减少除法就行了!

    把公式改为a=s-b/2+1,这样精度的问题就可以忽略了,然后就A掉了呢

    #include <algorithm> 
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #define max(a,b) (a>b?a:b)
    #define k1 (double(m)/double(n))
    #define k2 (double(m)/double(n-p))
    #define b (-p*k2)
    
    using namespace std;
    
    double n,m,p;
    double tot;
    
    int main(){
     scanf("%lf%lf%lf",&n,&m,&p);
     tot=double(__gcd((int)n,(int)m)+__gcd((int)fabs(p-n),(int)m)+p);
     printf("%.0lf
    ",p*m/2-tot/2+1);
     return 0;
    }
    
    May you return with a young heart after years of fighting.
  • 相关阅读:
    vue脚手架搭建项目
    springmvc上传下载文件
    vue双向绑定(模型变化,视图变化,反之亦然)
    android中广告轮播图总结
    studio插件
    系统图片uri的问题
    android
    mysql 外键(FOREIGN KEY)使用介绍
    不用加减乘除来做加法的题目
    Comparable接口实现和使用方法介绍
  • 原文地址:https://www.cnblogs.com/Equinox-Flower/p/9600573.html
Copyright © 2011-2022 走看看