不如来21玩一局?

不如来21玩一局?

时间: 1ms        内存:128M

描述:

又是一年毕业季,校吧内掀一起了一阵吧聚狂潮。大家聚到21,聊聊天,秀秀ID,玩玩游戏。

墨尔本为了显示高大上,推荐了这样一个游戏,假设把平地看成一个坐标轴,让三个大吧分别站在(0,0)(a,b)(c,0)的位置,两两之间拉一根直线, 然后让其他人站在里面,但是有一个要求,只能站在整数格点上(即x,y坐标都是整数),如果线穿过了某些整数格点,则人不能站在上面。现在由墨尔本随意说 a,b,c的值,你能帮忙确定能有多少人能够站在围成的图形内吗?

输入:

输入三个整数a,b,c.并且0<=a<=30000,0<b<=30000,0<c<10^5;

输出:

输出只有一行,包含一个整数,代表能站在围成的图形内的人数

示例输入:

5 6 7

示例输出:

17

提示:

参考答案(内存最优[1092]):

/*#include<iostream>
#include<cmath>
using namespace std;

int Gcd(int n,int m)
{
    int x=n%m;
    while(x!=0)
    {
        n=m;
        m=x;
        x=n%m;
    }
    return m;
}

int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    int ans;
    ans=(c*a)/2;
    int l1,l2,l3;
    l1=Gcd(a,b);
    l2=Gcd(a,fabs(b-c));
    cout<<ans-(l1+l2)/2+1<<endl;
}*/
#include<cstdio>//s=l/2+n-1;
#include<cmath>
#include<cstdlib>
int a,b,c,d,e,f;
int area()
{
    return abs((a*d+c*f+b*e-a*f-b*c-d*e)/2);
}
int gcd(int x,int y)
{
    if(y==0)
        return x;
    else
        return gcd(y,x%y);
}
int main ()
{
        int k=0;
        scanf("%d%d%d",&c,&d,&e);
        a=b=f=0;
        int s=area();
        int l1=gcd(abs(a-c),abs(b-d));
        int l2=gcd(abs(a-e),abs(b-f));
        int l3=gcd(abs(c-e),abs(d-f));
        printf("%d\n",s-(l1+l2+l3)/2+1);
    return 0;
}

参考答案(时间最优[0]):

#include <iostream> 
using namespace std; 
int main() 
{ 
    float a,b,c,x1,x2; 
    int i,j,n=0,x3,x4; 
    cin>>a>>b>>c; 
    for(i=1;i<b;i++) 
    { 
       x1=i*(a/b); 
       x2=((a-c)/b)*i+c; 
       x3=int(x1); 
       x4=int(x2); 
       if(x4==x2) 
           n=n+x4-x3-1; 
       else
           n=n+x4-x3; 
    } 
    cout<<n<<endl; 
    return 0; 
}   

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注