题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2666

题意:n种零件,m个位置,每个位置有一种零件。求一个位置x,使得cost(1)+cost(2)+…+cost(n)最小。cost(i)表示x到最近的i类型零件的距离的平方。

思路:我们最后的最优答案一定从所有m个位置中选出了n个使得每种零件恰有一个。设第i种零件的所有位置集合是Si,Si的大小是Ci

我们可以直接枚举最后选出的第i种零件是哪一个,一旦确定了这n个零件。那么最优位置是哪里呢?我们设这n个位置是x1,x2,……xn,那么

不过这样的复杂度是

貌似有点大。我们换个思路。我们首先选取每个零件位置最小的那个,这样我们可以得到一个初始解。这个初始解很可能不是最优解。那么我们如何得到最优解?我们可以尝试每次从这个初始解中选出一个类型的零件,被该类型的另一个零件替换。那该如何选取呢?

我们将第i种类型的零件按照位置升序排序。将所有类型零件的第x个被第x+1个替换,称作一次操作,我们将所有这样的操作放在一起,每个操作用一个三元组表示:

我们将所有这些操作按照pre+next升序排序。我们下面证明:按照这个排序完的顺序依次替换一定能找到最优值。

(1)假设某一次,将某种零件的位置换了,不妨设为第一种零件,替换前的位置为A1,替换后的位置为B1。如果最优解中是B1,那么这次操作固然合理,因为我们向最优解靠近了一步;

(2)假设最优解中是A1,那么坏了,我们这样操作已经偏离了最优解。我们证明,如果到目前最优解还没找到,那么这种情况不存在,也就是最优解中不可能是A1。

假设是A1,那么也就是说在替换了其他的一些类型之后达到最优解。其他一些类型不好说,我们就假设替换了其他某一个类型后达到最优解,我们不妨设替换了第二种类型的零件,设替换前是A2,替换后是B2。在这里,我们有以下前提成立:

aaarticlea/png;base64,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" alt="" />

因为我们是准备替换第一种类型的。按照我们排序的标准有以上式子成立。

由于最后答案中的最优解是A1,而不是B1,那么有以下成立:令$X=\sum_{i=3}^{n}A_{i}^{2},Y=\sum_{i=3}^{n}A_{i}$

$(A_{1}^{2}+B_{2}^{2}+X)-\frac{(A_{1}+B_{2}+Y)^{2}}{n}<(B_{1}^{2}+B_{2}^{2}+X)-\frac{(B_{1}+B_{2}+Y)^{2}}{n}$

化简得到$A_{1}+B_{1}>\frac{A_{1}+B_{1}+2B_{2}+2Y}{n}$

同理B2优于A2,那么有

$(A_{1}^{2}+B_{2}^{2}+X)-\frac{(A_{1}+B_{2}+Y)^{2}}{n}\leq (A_{1}^{2}+A_{2}^{2}+X)-\frac{(A_{1}+A_{2}+Y)^{2}}{n}$

化简得到$A_{2}+B_{2}\leq \frac{A_{2}+B_{2}+2A_{1}+2Y}{n}$

由于$(A_{1}+B_{1}+2B_{2}+2Y)-(A_{2}+B_{2}+2A_{1}+2Y)=(B_{1}+B_{2})-(A_{1}+A_{2})>0$,所以$A_{2}+B_{2}\leq \frac{A_{2}+B_{2}+2A_{1}+2Y}{n}<\frac{A_{1}+B_{1}+2B_{2}+2Y}{n}<A_{1}+B_{1}$

即$A_{2}+B_{2}<A_{1}+B_{1}$

与前提矛盾。因此这种情况不存在。

因此我们得到算法:

const int N=100005;

int n,m;
vector<int> V[N]; struct node
{
int x1,x2,x; node(int _x1=0,int _x2=0,int _x=0)
{
x1=_x1;
x2=_x2;
x=_x;
}
}; vector<node> A; int cmp(node a,node b)
{
return a.x<b.x;
} int main()
{
n=myInt();
m=myInt(); for(int i=1;i<=m;i++)
{
int x=myInt();
int y=myInt();
V[y].pb(x);
}
double S=0,P=0;
for(int i=1;i<=n;i++)
{
S+=V[i][0];
P+=sqr(V[i][0]);
for(int j=1;j<SZ(V[i]);j++)
{
A.pb(node(V[i][j-1],V[i][j],V[i][j-1]+V[i][j]));
}
}
sort(A.begin(),A.end(),cmp); double Min=P-S*S/n,ans=S/n; for(int i=0;i<SZ(A);i++)
{
double x1=A[i].x1;
double x2=A[i].x2;
P-=x1*x1;
P+=x2*x2;
S-=x1;
S+=x2; if(P-S*S/n<Min) Min=P-S*S/n,ans=S/n;
}
printf("%.4lf\n",ans);
}

BZOJ 2666: [cqoi2012]组装的更多相关文章

  1. [CQOI2012]组装 (贪心)

    CQOI2012]组装 solution: 蒟蒻表示并不会模拟退火,所以用了差分数组加贪心吗.我们先来看题: 在数轴上的某个位置修建一个组装车间 到组装车间距离的平方的最小值. 1<=n< ...

  2. [CQOI2012]组装 贪心

    [CQOI2012]组装 贪心好题. LG传送门 首先有一个必须要能推的式子:设第\(i\)种零件选的生产车间位置为\(x _ i\),组装车间位置为\(x\), 则总的花费为 \[f(x) = \s ...

  3. 【BZOJ2666】[cqoi2012]组装 贪心

    [BZOJ2666][cqoi2012]组装 Description 数轴上有m个生产车间可以生产零件.一共有n种零件,编号为1~n.第i个车间的坐标为xi,生产第pi种零件(1<=pi< ...

  4. bzoj 2669 [cqoi2012]局部极小值 DP+容斥

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 838  Solved: 444[Submit][Status ...

  5. BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流

    传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...

  6. BZOJ 2668: [cqoi2012]交换棋子

    2668: [cqoi2012]交换棋子 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1112  Solved: 409[Submit][Status ...

  7. ●BZOJ 2669 [cqoi2012]局部极小值

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题解: 容斥,DP,DFS 先看看 dp 部分:首先呢,X的个数不会超过 8个.个数很 ...

  8. luogu P3162 [CQOI2012]组装

    传送门 mdzz,为什么这题有个贪心的标签啊qwq 首先考虑每一种车间,对于每相邻两个车间,在中点左边那么左边那个会贡献答案,在右边就右边那个更优 所以总共会有m-1个这样的分界中点,然后最多有m+1 ...

  9. Luogu3162 CQOI2012 组装 贪心

    传送门 如果提供每一种零件的生产车间固定了,那么总时间\(t\)与组装车间的位置\(x\)的关系就是 \(t = \sum (x-a_i)^2 = nx^2-2\sum a_ix + \sum a_i ...

随机推荐

  1. 搞笑的u盘图片

  2. 再次尝试mtk线刷时发现的一些资源

    线刷用到的工具:spflashtool,也可以下载vcom drivers 下载:http://spflashtool.com/ 查看usb状态的软件:usbdeview,网站里还有一些其它的软件 下 ...

  3. zw版【转发·台湾nvp系列Delphi例程】HALCON SetLineStyle1

    zw版[转发·台湾nvp系列Delphi例程]HALCON SetLineStyle1 procedure TForm1.Button1Click(Sender: TObject);var img : ...

  4. 【crunch bang】文件管理器-thunar

    Thunar拥有的实用功能: 缩略图查看 批量重命名 安装: $ sudo apt-get install thunar 加速thunar启动速度 sudo leafpad /usr/share/gv ...

  5. Spring JDBC保存枚举对象含关键字报错原因之一

    报错信息: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized S ...

  6. thinkPHP3.2.3完整版 在sae上面的部署

    第一步:         thinkPHP3.2.3完整版,目录结构如下 第二步:在新浪sae上面创建一个新应用 第三步:用svn  down,下来会有两个文件:index.php.config.ya ...

  7. WMsg参数常量值

    //WMsg参数常量值: //创建一个窗口 const int WM_CREATE = 0x01; //当一个窗口被破坏时发送 const int WM_DESTROY = 0x02; //移动一个窗 ...

  8. apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定

    摘要:apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定,根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管用的让apache支持中文域名 ...

  9. postgresql压力测试工具用法以及参数解读

    pgbench是PostgreSQL自带的一个数据库压力测试工具, 支持TPC-B测试模型, 或自定义测试模型. 自定义测试模型支持元命令, 调用shell脚本, 设置随机数, 变量等等. 支持3种异 ...

  10. bianwu | 数据行 | 填写意见

    protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e) { //首先判断是否是数据行 if (e.Row.RowT ...