题目大意

给定 $n$($n$ 是偶数,$2\le n\le 2\times 10^{5}$)个非负整数 $a_1,\dots, a_n$($a_i\le 10^9$)。
要求将其中 $n/2$ 个数变成平方数,另外 $n/2$ 个数变成非平方数,变化后的数必须仍是非负整数。
将 $x$ 变成 $x'$ 的代价为 $|x-x'|$ 。
求最小的总代价。

比赛时我的思路

用 $c_{i,0}$ 表示将 $a_i$ 变成平方数的最小代价,$c_{i,1}$ 表示将 $a_i$ 变成非平方数的最小代价,不难求出这两个值。
那么问题转化为

从 $c_{1,0}, c_{2,0}, \dots, c_{n,0}$ 和 $c_{1,1}, c_{2,1}, \dots, c_{n,1}$ 中各取出 $n/2$ 个数,限制条件是:$c_{i,0}$ 和 $c_{i,1}$ 不能都取。
求取出的数的最小和。

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

转化后的问题的解法

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

  1. $c_{i,0}, c_{j,1}$ 在所取的数中,且
  2. $c_{i,0} + c_{j,1} > c_{i,1} + c_{j,0}$ 。

第二个条件可化为
$c_{i,1} - c_{i,0} < c_{j,1} - c_{j,0}$

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

将下标 $1, 2,\dots,i,\dots, n$ 按 $c_{i,1} - c_{i,0} $ 从小到大排序,对前 $n/2$ 个下标取 $c_{i,1}$,对后 $n/2$ 个下标取 $c_{i,0}$ 。

题解上解法

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

转载于:https://www.cnblogs.com/Patt/p/8052993.html

Codeforces 898E Squares and not squares相关推荐

  1. perfect squares java,Perfect Squares

    题目来源 一道DP题,求一个数最少由几个平方数组成.我一开始用二维DP, 因为是个完全背包问题,所以需要注意每个数都是可以取多次的. 代码如下: class Solution { public: in ...

  2. 《算法竞赛入门经典》习题4-2 正方形 (Squares,ACM,ICPC World Finals 1990,UVa201)——仅提供大体方法

    原题及翻译 A children's board game consists of a square array of dots that contains lines connecting some ...

  3. Coursera自动驾驶课程第13讲:Least Squares

    在上一讲<Coursera自动驾驶课程第12讲:Semantic Segmentation>我们学习了深度学习的另一个重要应用:语义分割.至此,本课程的视觉感知模块就介绍完了. 从本讲开始 ...

  4. Codeforces 题目合集+分类+代码 【Updating...】【361 in total】

    961A - Tetris                                                模拟                                      ...

  5. Python记录-基础语法入门

    # -*- coding: utf-8 -*- #数字计算 a=1 b=2 print(a+b) print(a*b) print((a+b)/1) #浮点数 print((a+b)//2) ##保留 ...

  6. opencv检测矩形

    参考:使用OpenCV检测图像中的矩形_知来者逆的博客-CSDN博客_opencv检测图像中的矩形 1.得到原始图像之后,代码处理的步骤是: (1)滤波增强边缘. (2)分离图像通道,并检测边缘. ( ...

  7. [LeetCode]202. Happy Number(平衡二叉树 哈希表)

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  8. python小项目实例流程-《Python编程:从入门到实践》DEMO实例代码

    这篇文章主要知识点是关于Python编程,从入门到实践,DEMO,,的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书 前言 之前,项目后台基本都是使用 Java 的 SpringBo ...

  9. Kotlin极简教程:第9章 轻量级线程:协程

    原文链接:https://github.com/EasyKotlin 在常用的并发模型中,多进程.多线程.分布式是最普遍的,不过近些年来逐渐有一些语言以first-class或者library的形式提 ...

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续4)
  2. 执行spring boot应用三种方式
  3. 在一个JSP页面中包含另一个JSP页面的三种方式
  4. 网站排名优化需掌握四项基本要素
  5. php中mysqli用法举例
  6. 网络安全应急响应-恶意代码分析技术
  7. 如何在电脑端安装哔哩哔哩?
  8. bat 脚本(批处理)操作注册表
  9. php给图片添加水印图片,PHP实现给图片添加文字水印
  10. 屏幕尺寸大全和UI设计规范
  11. 江苏大学正版Windows和Office全家桶--UJS微软正版化服务平台
  12. 2023-03-27-安装office365显示Microsoft Office 专业增强版 2016
  13. springMvc ResultFul风格 url拼接问题
  14. java使用poi逐页读取ppxt,JAVA-WEB(通过POI)实现PPT在线预览
  15. 关于chrome、360浏览器自动填充的黄色背景处理方案
  16. 【Android】多渠道打包与签名机制
  17. Ionic+cordova+angularJS 项目实现IPhone 下拉框滚动效果
  18. 搭载鸿蒙系统的华为电脑,华为MatePad Pro配置曝光,搭载骁龙870芯片,还有鸿蒙系统加持...
  19. 机器学习项目(一)——垃圾邮件的过滤技术
  20. 树莓派4B无屏幕连接Wi-Fi/启用ssh/创建用户

热门文章

  1. 强化学习-动态规划_强化学习-第5部分
  2. WordPress的用户系统总结
  3. 语言print如何实现连续输出_【每日一题】如何实现一个高效的单向链表逆序输出?...
  4. 平板电脑办公软件_大屏平板互动软件-平板电脑触摸大屏控制软件
  5. currenthashmap扩容原理_高并发编程系列:深入探讨ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)...
  6. UnityEngine.UI.dll 路径
  7. matlab求距离判别函数,求MATLAB的逐步判别程序 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  8. 双稳态继电器工作原理图_固态继电器只有单一的作用吗?带你了解不一样的固态继电器...
  9. 计算机视觉、机器学习相关领域论文和源代码大集合--持续更新……
  10. Multiple Dispatch