#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
// #define INPUT
/**
Problem: UVA10167 - Birthday Cake
Begin Time:22nd/Mar/2012 5:00 p.m.
End Time: 22nd/Mar/2012 7:35 p.m.
Last Time: 2H 35M
Thought:
就是根据题目中给的条件搜索
1.A,B∈[-500,500]
2.至少有一个解,输出其中之一就可以了
Experience:
这么简单的一道题,竟然WA了10次+,究其原因,就是审题不细 + 搜索功底不行
1.由于审题不细,有2n lines follow没看到,导致输入的时候只输入了N行,WAWAWA
2.由于审题不细,没看到给出了答案的范围,从而想得有些复杂,WAWAWA
3.搜索的时候一定要注意!!先搜索再判断解,在这道题里是这样的
如果你把判断解先放在前面,那么可能搜索到了下一个状态,但是你的解停留在
上一个状态,这时候你输出的i,j是现在的状态而不是上一个状态,导致WA,这个
问题是WA的最多次的,日日日。
Knowledge Point:
单纯的搜索,甚至归类不能归成BFS/DFS。
*/
using namespace std;
const int MAX_CHERRY = 110000;
struct node
{
int x;
int y;
};
node cherry[MAX_CHERRY];
void Solve(const int num)
{
int moreThan = 0;
int lessThan = 0;
for(int i = -500 ; i <= 500 ; i++)
{
for(int j = -500 ; j <= 500 ; j++)
{
moreThan = 0; lessThan = 0;
for(int k = 0 ; k < num ; k++)
{
if(cherry[k].x * i + cherry[k].y * j > 0)
{
moreThan++;
}
if(cherry[k].x * i + cherry[k].y * j < 0 )
{
lessThan++;
}
if(cherry[k].x * i + cherry[k].y * j == 0)
{
break;
}
if(moreThan == lessThan && moreThan + lessThan == num)
{
printf("%d %d\n",i,j);
return;
}
}
}
}
}
int main()
{
#ifdef INPUT
freopen("b:\\acm\\uva\\UVA10167\\input.txt","r",stdin);
#endif
int n;
int x,y,num;
while (scanf("%d",&n) != EOF )
{
if ( n == 0 ) break;
x = 0 ; y = 0 ; num = 0;
for(int i = 0 ; i < 2 * n ; i++)
{
scanf("%d %d",&cherry[i].x,&cherry[i].y);
}
Solve(2*n);
}
return 0;
}
【UVa10167】 Birthday Cake,思路+代码+解题报告
最新推荐文章于 2021-05-13 14:06:43 发布