C.重力坠击
题目链接:https://ac.nowcoder.com/acm/contest/9983/C
题目描述:
在一个二维平面上有n个敌人,第i个敌人可以描述为一个以( xi ,yi )为圆心,ri为半径的圆。
你每次可以对一个半径为R的圆范围内进行攻击(圆心自选,但圆心的横纵坐标必须为整数),对于与你攻击范围有交点的敌人都会被消灭。
你总共可以发动k次攻击,问最多能消灭多少敌人。
输入描述:
第一行以空格分隔的三个整数n,k,R。
接下来n行每行以空格分隔的三个整数xi ,yi ,ri 。
1≤n≤10
1≤k≤3
1≤ri,R≤7
0≤∣xi∣,∣yi∣≤7
敌人的位置可能会有重叠。
输出描述:
输出一行一个正整数代表答案。
示例1:
输入
3 1 1
0 0 1
7 7 1
-2 0 1
输出
2
说明
只能发动一次攻击,可以攻击圆心为(-1,0)的圆,这样可以消灭第一个和第三个敌人。
解题思路:
①1≤k≤3 可以确定最多三次攻击(枚举)
②1≤ri,R≤7 0≤∣xi∣,∣yi∣≤7 可以确定攻击的范围:下标在[-7,7]
③(i-x[k])(i-x[k])+(j-y[k])(j-y[k])<=(r[k]+R)*(r[k]+R) 可以确定相交条件(即满足条件可以消灭敌人)
代码如下:
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
int x[15],y[15],r[15];
vector<int>v;
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,K,R;
int ans=0;
cin>>n>>K>>R;
for(int i=0;i<n;i++){
cin>>x[i]>>y[i]>>r[i];
}
for(int i=-7;i<=7;i++){
for(int j=-7;j<=7;j++){
int cnt=0;
for(int k=0;k<n;k++){
if((i-x[k])*(i-x[k])+(j-y[k])*(j-y[k])<=(r[k]+R)*(r[k]+R)) //🍌相交
cnt++;
}
v.push_back(cnt); //尾部添加cnt元素
}
}
sort(v.begin(),v.end(),cmp); //从大到小排序
for(int i=0;i<K;i++)
ans+=v[i];
cout<<min(n,ans)<<endl;
return 0;
}