Codeforces 898E Squares and not squares

题目大意

给定 nn 是偶数,2n2×105)个非负整数 a1,,anai109)。
要求将其中 n/2 个数变成平方数,另外 n/2 个数变成非平方数,变化后的数必须仍是非负整数。
x 变成 x 的代价为 |xx|
求最小的总代价。

比赛时我的思路

ci,0 表示将 ai 变成平方数的最小代价,ci,1 表示将 ai 变成非平方数的最小代价,不难求出这两个值。
那么问题转化为

c1,0,c2,0,,cn,0c1,1,c2,1,,cn,1 中各取出 n/2 个数,限制条件是:ci,0ci,1 不能都取。
求取出的数的最小和。

比赛时我想到这里就进展不下去了。

转化后的问题的解法

对于任意一个合法的取数方案,如果不是最优解,则必然存在 i,j 满足:

  1. ci,0,cj,1 在所取的数中,且
  2. ci,0+cj,1>ci,1+cj,0

第二个条件可化为
ci,1ci,0<cj,1cj,0

这样便得出这个问题的解法:

将下标 1,2,,i,,nci,1ci,0 从小到大排序,对前 n/2 个下标取 ci,1,对后 n/2 个下标取 ci,0

题解上解法

统计输入的 n 个数中平方数和非平方数的个数,分别记做 c0,c1
c0=c1 则无需改变。
c0>c1 则需要把 (c0c1)/2 个平方数变成非平方数。对于非零的平方数,加 1 即可,零则须加 2 。所以,优先改变非零的平方数。
c0<c1 则需把 (c0c1)/2 个非平方数变成平方数。

posted @   Pat  阅读(296)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
阅读排行:
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 99%的人不知道,桥接模式失败的真正原因是它!
· .NET Core GC压缩(compact_phase)底层原理浅谈
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
历史上的今天:
2016-12-17 将文件移出版本控制 (Revision Control)
2016-12-17 MVC 总结
点击右上角即可分享
微信分享提示