我的思路是dfs遍历每一个点,找消灭敌人的最大值,但是只过了95%样例,有大佬是哪里错了吗
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define int long long const int mod=1e9+7; int n,k,R; struct ani { int x,y,r; }p[16]; vector<int> v[16][16]; bool stt[16]; bool dis(int i,int j,int x) { if(((i-p[x].x)*(i-p[x].x)+(j-p[x].y)*(j-p[x].y))<=(R+p[x].r)*(R+p[x].r)) return 1; else return 0; } int max1=0; void dfs(int num,int xx,int yy,int sum) { if(yy==15) { xx++; yy=0; } if(num==k||xx==15) { max1=max(max1,sum); return; } for(int i=xx;i<=14;i++) { for(int j=yy;j<=14;j++) { bool st[16]; memcpy(st,stt,sizeof(st)); int s=0; for(auto w:v[i][j]) if(stt[w]) s++; int ss=v[i][j].size()-s; for(auto w:v[i][j]) stt[w]=1; dfs(num+1,i,j+1,sum+ss); memcpy(stt,st,sizeof(stt)); } } } signed main() { cin>>n>>k>>R; for(int i=1;i<=n;i++) { cin>>p[i].x>>p[i].y>>p[i].r; p[i].x+=7; p[i].y+=7; } for(int i=0;i<=14;i++) { for(int j=0;j<=14;j++) { for(int q=1;q<=n;q++) if(dis(i,j,q)) { v[i][j].push_back(q); } } } dfs(0,0,0,0); cout<<max1; return 0; }
全部评论
(2) 回帖