ACM学习历程—BestCoder 2015百度之星资格赛1004 放盘子(策略 && 计算几何)

Problem Description

小度熊喜欢恶作剧。今天他向来访者们提出一个恶俗的游戏。他和来访者们轮流往一个正多边形内放盘子。最后放盘子的是获胜者,会赢得失败者的一个吻。玩了两次以后,小度熊发现来访者们都知道游戏的必胜策略。现在小度熊永远是先手,他想知道他是否能获胜。

注意盘子不能相交也不能和多边形相交也不能放在多边形外。就是说,盘子内的点不能在多边形外或者别的盘子内。

Input

第一行一个整数T 
,表示T 
组数据。每组数据包含
个数n,a,r(4n100,0<a<1000,0<r<1000


是偶数,代表多边形的边数,
代表正多边形的边长,
代表盘子的半径。

Output

对于每组数据,先输出一行

Case #i:

然后输出结果.如果小度熊获胜,输出”Give me a kiss!” 否则输出”I want to kiss you!”

Sample Input
2
4 50 2.5
4 5.5 3
Sample Output
Case #1:
Give me a kiss!
Case #2:
I want to kiss you!
Hint
在第一组样例中,小度熊先在多边形中间放一个盘子,接下来无论来访者怎么放,小度熊都根据多边形中心与来访者的盘子对称着放就能获胜。

 

在Hint已经说明。

只需要首先在中心放盘子,然后来访者无论怎么放,小度熊自然可以对称来放。

所以只要第一个能放下是必胜的。

第一个判断就是判断中心点到多边形边的距离和盘子半径进行比较。

 

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <deque>
#include <map>
#include <set>
#include <string>
#define LL long long

using namespace std;

const double PI = acos(-1);

int main()
{
    //freopen("test.in", "r", stdin);
    int T, n;
    double a, r;
    scanf("%d", &T);
    for (int times = 1; times <= T; ++times)
    {
        printf("Case #%d:\n", times);
        scanf("%d%lf%lf", &n, &a, &r);
        if (a/2/tan(PI/n) <= r)
            printf("I want to kiss you!\n");
        else
            printf("Give me a kiss!\n");
    }
    return 0;
}

 

posted on 2015-05-25 21:11  AndyQsmart  阅读(270)  评论(0编辑  收藏  举报

导航