2666: [cqoi2012]组装

本文介绍了一道关于数轴上颜色点的优化问题,通过计算每个颜色点到其他点的距离平方和来找到最佳位置,利用数据结构和算法进行求解,并分享了实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目大意:给定数轴上的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值