input | output |
---|---|
2 0 0 0 1 1 0 1 1 2 0 0 1 0 0 3 1 5 |
0.000 1.937 |
思路:之前遇到了类似的题。由于这样的题比较抽象,当时我是陷入了矛盾的,A既要让自己越大越好,又要使B越小越好(B同理),这两个标准会不会又矛盾呢,该遵循哪一个呢。
此题可以推出来,二则在使自己大的时候,也约束 了对方更小。
val A= Sum( distant(pi,pj) ) { i<j && i,j belong to A} - Sum( distant(pi,pj) ) {i<j && i,j belong to B}
= Sum( distant(pi,pj) ) {i,j belong to Q} - Sum( distant(pi,pj) ) { i belong to B && j belong to Q}
(其中Q是全集。
我们令dis是点到其他所有点的距离之和,那么A和B都按照dis从大到小选,既能要自己更大,也能让对方更小。
(下次再遇到这样的题,就用公式,把他们的标准统一就好了(如果可以的话)。
#include<bits/stdc++.h> using namespace std; const int maxn=1010; double x[maxn],y[maxn],dis[maxn],ans;int p[maxn]; bool cmp(int w,int v){ return dis[w]>dis[v]; } double dist(int u,int v){ return sqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v])); } int main() { int N; while(scanf("%d",&N)==1){ N<<=1; for(int i=1;i<=N;i++) scanf("%lf%lf",&x[i],&y[i]); for(int i=1;i<=N;i++) p[i]=i; for(int i=1;i<=N;i++){ dis[i]=0.; for(int j=1;j<=N;j++) dis[i]+=dist(i,j); } sort(p+1,p+N+1,cmp); ans=0; for(int i=1;i<=N;i++){ double tmp=0.0; for(int j=i+2;j<=N;j+=2) tmp+=dist(p[i],p[j]); if(i&1) ans+=tmp; else ans-=tmp; } printf("%.3lf\n",ans); } return 0; }