Description
Input
Output
Sample Input
2 2 1 1 0 0 4 4 3 100 1 0 0 1 1 500 500
Sample Output
2.00 201.41
题解:用容斥的方法,选出所有情况,对于每种情况把选好的点和未选好的点分别放在两个集合中,对于未匹配的点搜索找区间覆盖这个点的最大距离,回溯当前距离;在结果中找最小值;
AC代码:
#include#include #include #include #include #include using namespace std;const int INF=0xfffffff;#define mem(x,y) memset(x,y,sizeof(x))#define SI(x) scanf("%d",&x)#define PI(x) printf("%d",x)typedef long long LL;const int MAXN=110;double lx[MAXN],ly[MAXN];double mp[MAXN][MAXN];int N,ta,tb;int a[MAXN],b[MAXN];double ans,sum;double C,R;double d[MAXN];double getl(int i,int j){ double y=ly[j]-ly[i],x=lx[j]-lx[i]; return sqrt(x*x+y*y);}void solve(int m){ if(m==0){ double res=0; for(int i=0;i
刚开始没考虑太多,之所以wa,因为我只是对每个点找到已经选的点的最小距离,由于这是雷达,已选的点可以覆盖多个未选的点,那么距离就是最大的那个距离,而我的可能会重复;
WA代码:
#include#include #include #include #include #include using namespace std;const int INF=0xfffffff;#define mem(x,y) memset(x,y,sizeof(x))#define SI(x) scanf("%d",&x)#define PI(x) printf("%d",x)typedef long long LL;const int MAXN=110;double lx[MAXN],ly[MAXN];double mp[MAXN][MAXN];int N;double ans;double C,R;double d[MAXN];double getl(int i,int j){ double y=ly[j]-ly[i],x=lx[j]-lx[i]; return sqrt(x*x+y*y);}void work(){ ans=INF; for(int i=1;i<(1<