UVa 10167 生日蛋糕

题意:有一个半径为100的圆形蛋糕,蛋糕上有一些樱桃。现在妈妈要把蛋糕分两半,因为要均分给两人,所以肯定是从原点切出来的。然后还需要两半蛋糕各含一半数目的樱桃,而且所切的地方不会切到樱桃。求所切下的这条直线的方程,Ax+By=0 中的 A 和 B 的值。

cherry 樱桃;beeline 直线;coordinate 坐标

思路:可以看到大体的思路就是找到一条直线,使得所有樱桃的坐标满足 Ax+By>0 和 <0 的个数各一半,而且没有等于0的。而且很容易看到应该不止一条直线,甚至对同一条直线,A 和 B 的值都不能唯一。可以想到用枚举。主要就是 A 和 B 的范围的确定。本想确定下范围的,无奈算来算去发现A、B的范围好像无法确定,看别人都是从[-500,500]枚举的,但是谁能解释下题目中的 mustn't 的意思!是笔误吗,还是有别的意思?

如果想优化,可以用一个vis数组避免重复枚举相同的直线,x+y=0和2x+2y=0是相同的直线。

Code:

#include<stdio.h>
#define N 55

void solve(int n);

int cherry[2*N][2];

int main()
{
  int n;
  while(scanf("%d",&n)==1 && n)
  {
    for(int i=0;i<2*n;++i)
    {
      scanf("%d%d",&cherry[i][0],&cherry[i][1]);      
    }            
    solve(n);
  }
  return 0;  
}

void solve(int n)
{
  for(int a=-500;a<=500;++a)
  {
    int flag=0;
    for(int b=-500;b<=500;++b)
    {
      int cnt=0;//每一组a,b值时,Ax+By>0的个数 
      int cherryflag=0;//是否经过樱桃 
      for(int i=0;i<2*n;++i)
      {
        int val=a*cherry[i][0]+b*cherry[i][1];
        if(val==0) { cherryflag=1; break;}//直线不能经过樱桃 
        if(val>0) cnt++;
      }      
      if(!cherryflag && cnt==n) { flag=1; printf("%d %d\n",a,b); break;}
    }
    if(flag) { break;}
  }   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值