USACO-Section 3.4 Electric Fence (模拟)

16 篇文章 0 订阅

描述

在本题中,格点是指横纵坐标皆为整数的点。

为了圈养他的牛,农夫约翰(Farmer John)建造了一个三角形的电网。他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(0<=n<32000,0<m<32000),再连接格点(p,0)(p>0),最后回到原点。

牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分瘦的牛)。如果一个格点碰到了电网,牛绝对不可以被放到该格点之上(或许Farmer John会有一些收获)。那么有多少头牛可以被放到农夫约翰的电网中去呢?

格式

PROGRAM NAME: fence9

INPUT FORMAT:

(file fence9.in)

输入文件只有一行,包含三个用空格隔开的整数:n,m和p。

OUTPUT FORMAT:

(file fence9.out)

输出文件只有一行,包含一个整数,代表能被指定的电网包含的牛的数目。

SAMPLE INPUT

7 5 10

SAMPLE OUTPUT

20

第一反应就是按照解析几何的方法做,不过有很多特殊情况,比如会是垂直(n=0或p=0),(p<n或p>n)

WA了几次才全部想到


/*
ID: your_id_here
PROG: fence9
LANG: C++
*/
#include <cstdio>
#include <cmath>

using namespace std;

int n,m,p,ans=0;
double k1,k2,b2,y;

const double EPS=0.000001;

int main() {
    freopen("fence9.in","r",stdin);
    freopen("fence9.out","w",stdout);

    scanf("%d%d%d",&n,&m,&p);
    if(n==0) {
        k2=-1.0*m/p;
        b2=m;
        for(int x=1;x<p;++x) {
            y=k2*x+b2;
            if(abs(y-(int) (y+EPS))<EPS)//判断该点是否为整点;取整是向下取整,所以要加上EPS再取整
                y-=1;
            ans+=(int) (y+EPS);
        }
    }
    else {
        k1=1.0*m/n;
        for(int x=1;x<n;++x) {
            y=k1*x;
            if(abs(y-(int) (y+EPS))<EPS)
                y-=1;
            ans+=(int) (y+EPS);
        }
        if(n<p) {
            k2=1.0*m/(n-p);
            b2=-k2*p;
            for(int x=n;x<p;++x) {
                y=k2*x+b2;
                if(abs(y-(int) (y+EPS))<EPS)
                    y-=1;
                ans+=(int) (y+EPS);
            }
        }
        else if(n>p) {
            k2=1.0*m/(n-p);
            b2=-k2*p;
            for(int x=n-1;x>=p;--x) {//由于该线上的点也不符合,所以不必排除它,在总数中减去即可
                y=k2*x+b2;
                ans-=(int) (y+EPS);
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值