题目大意:给定数轴上的m个点,共有n种颜色,要求在数轴上选定一个点,使这个点到每种颜色最近的点的平方和最小
题解:Orz
我的收获 :证明太神啦
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define M 100005
int n,m,x,y,point[M],f[M];
double P,S,ans,pos;
struct node{int a,b,v;};
vector<node> s;
bool cmp(node x,node y){return x.v<y.v;}
void work()
{
for(int i=0;i<s.size();i++)
{
double t1=s[i].a,t2=s[i].b;
P-=t1*t1,P+=t2*t2;
S-=t1,S+=t2;
if(P-S*S/n<ans) ans=P-(S*S)/n,pos=S/n;
}
printf("%.4lf\n",pos);
}
void init()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(!f[y]) point[y]=x,f[y]=1,P+=x*x,S+=x;
else s.push_back((node){point[y],x,(point[y]+x)}),point[y]=x;
}
ans=P-(S*S)/n,pos=S/n;
sort(s.begin(),s.end(),cmp);
}
int main()
{
init();
work();
return 0;
}