UVa 10167 - Birthday Cake

本文介绍了一种通过暴力方法解决樱桃收集问题的算法,并提出了优化思路。通过统计樱桃位置,利用两个变量区分直线两侧的樱桃数量,确保樱桃不在同一直线上。此外,还探讨了通过斜率排序和二分枚举的优化方案。

这道题是直接暴力,需要注意的是cherry不能在直线上,因此需要两个变量来分别统计在直线两边的个数;

还想到一种方法:把所有斜率排序,然后二分枚举,复杂度为O(n+n*lgn+lgn)。

 1 # include <stdio.h>
2
3 int c[105][2];
4
5 int main()
6 {
7 int n, c1, c2, A, B, i, ans[2];
8
9 while (1)
10 {
11 scanf("%d", &n);
12 if (!n) break;
13
14 for ( i = 1; i <= 2*n; ++i)
15 scanf("%d%d", &c[i][0], &c[i][1]);
16
17 for ( A = 0; A <= 500; ++A)
18 for ( B = -500; B <= 500; ++B)
19 {
20 c1 = 0;
21 c2 = 0;
22 for ( i = 1; i <= 2*n; ++i)
23 if (c[i][0]*A+c[i][1]*B > 0) ++c1;
24 else if (c[i][0]*A+c[i][1]*B < 0) ++c2;
25 if (c1 == n && c2 == n)
26 {
27 ans[0] = A;
28 ans[1] = B;
29 B = 501;
30 A = 501;
31 }
32 }
33
34 printf("%d %d\n", ans[0], ans[1]);
35 }
36
37 return 0;
38 }

转载于:https://www.cnblogs.com/JMDWQ/archive/2012/04/07/2436437.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值