uva 10167 Birthday Cake 枚举

来源:互联网 发布:加入淘宝充值平台赚钱 编辑:程序博客网 时间:2024/05/22 09:07

题目大意:

一块蛋糕上有若干个樱桃,求出一条直线,平分蛋糕上的樱桃。

分析:

       题目中写出A和B的范围知识-500到500之间的整数,樱桃的坐标是整数,范围也比较小,可以直接暴力枚举A和B。然后依次判断每个点在线段的上面还是下面,方法直接把点代到直线方程就可以,若大于0,说明在直线上面。当等于0时点在直线上,直接break。

还有就是当A和B其中一个等于0时,只需要判断一次就可以了,因为无论另外一个数是多少,结果都是代表x轴或y轴的直线。也是因为这一点,没有必要加上 if(i==0&&j==0)  continue这个判断。


#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<string>#include<cstring>#include<math.h>#include<algorithm>#include<assert.h>#include<stdlib.h>#include<stack>#include<vector>#include<map>#include<set>#define pi acos(-1.0)typedef long long LL;using namespace std;int main(){    int n;    int x[110];    int y[110];    int xx,yy;    while(scanf("%d",&n)&&n!=0)    {        int flag=0;        for(int i=0;i<n+n;i++)        {            scanf("%d%d",&x[i],&y[i]);        }        for(int i=-500;i<=500;i++)        {            for(int j=-500;j<=500;j++)            {                int down=0,up=0;                for(int s=0;s<n+n;s++)                {                    if(i*x[s]+j*y[s]==0)                        break;                    if(i*x[s]+j*y[s]<0)                        down++;                    else                        up++;                    if(down>n||up>n)                        break;                }                if(down==up&&down==n)                /*                这个地方注意一下,要判断down是否等于n                因为前面循环break的时候,可能是down和up                正好相等,但点还没有枚举完。                */                {                    xx=i;                    yy=j;                    flag=1;                    break;                }            }            if(flag)                break;        }        printf("%d %d\n",xx,yy);    }    return 0;}


0 0
原创粉丝点击