2357: 插塔憋憋乐
时间限制: 1 Sec 内存限制: 128 MB
提交: 82 解决: 18
[提交][状态][讨论版]
题目描述
众所不知,LLM是一位红警3大佬,打的非常厉害,但是曾经也是一位萌新,喜欢在家里放防御塔,然后攒单位。现在是这样的:
LLM有一个半径为R的基地,他想放一些防御塔,让任何一个敌方单位在进入自己基地的开始就受到防御塔的攻击,由于LLM希望敌人会顶着防御塔的攻击伤害自己,所以他希望任何一个敌人进入自己基地的时候就立刻受到至少两个防御塔的攻击,现在已知防御塔的防御半径为r,为了简化问题,我们假设:
1.如果一个敌人经过两个防御塔的防御的范围相切的点(如图所示),会受到两个防御塔的攻击,这里受到两个防御塔的伤害
2.不需要保证基地内部受到保护,只要保证敌人在进入基地时受到防御塔攻击即可
请问最少需要几个防御塔
LLM有一个半径为R的基地,他想放一些防御塔,让任何一个敌方单位在进入自己基地的开始就受到防御塔的攻击,由于LLM希望敌人会顶着防御塔的攻击伤害自己,所以他希望任何一个敌人进入自己基地的时候就立刻受到至少两个防御塔的攻击,现在已知防御塔的防御半径为r,为了简化问题,我们假设:
1.如果一个敌人经过两个防御塔的防御的范围相切的点(如图所示),会受到两个防御塔的攻击,这里受到两个防御塔的伤害
2.不需要保证基地内部受到保护,只要保证敌人在进入基地时受到防御塔攻击即可
请问最少需要几个防御塔
输入
每个测试文件少于1000组测试样例
每组测试样例包含两个整数R,r
1<=R,r<=500
输出
输出仅包含一个数字,代表需要的防御塔数量
样例输入
1 1
样例输出
2
思路:
题目意思理解错了,以为相切才能算受到两者的伤害。但其实只要在范围内就算受到伤害。
假设尽量使攻击范围最大,就是防御塔的直径落在基地的周长上面,可以求出一个防御塔所能够对应的基地的弧度。
贪心是因为,假设不能刚刚好排满防御塔,那就假设2的周长,然后只受到一座防御塔的攻击,再向上取整。
源代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double pi = acos(-1.0);
int main() {
int R,r;
while(scanf("%d %d",&R,&r)!=EOF) {
if(r>=R) printf("2\n");
else {
double C=2*pi*R*2;
double L=2*asin(r*1.0/R)*R;
int ans=(int)ceil(C/L);
printf("%d\n",ans);
}
}
return 0;
}