2021牛客寒假算法基础集训营3 C.重力坠击(枚举)

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;
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页