题意

有一个含有\(2n(n \leqslant2000)\)个实数的数列,取出\(n\)个向上取整,另\(n\)个向下取整。问取整后数列的和与原数列的和的差的绝对值。

就是说,令\(a\)为原数列,\(b\)为取整后数列,求

\[min(abs(\sum_{i=1}^{2n}a-\sum_{i=1}^{2n}b))
\]

解题思路

刚开始大力猜了一波贪心结论,然后怒WA n发……

我也不知道怎么会想到以下这个奇怪的结论的……

如果我们设\(n\)个被向上取整的数的小数部分的和为\(a\)(其中本来为整数的有\(x\)个),设\(n\)个被向下取整的数的小数部分的和为\(b\)。那么答案就是\(ans=abs(b-(n-a-x))=abs(b+a-n+x)\)。同时我们注意到,原数列中所有数的和为\(sum=a+b\),所以呢,就有\(ans=abs(sum-n+x)\)。

这,个,东,西,和,\(a\),\(b\),没,有,关,系!!!

然后容易发现\(max(0,n-x)\leqslant x \leqslant min(n,x)\)。所以就容易得出答案了!

参考程序

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int Maxn = 2010;
double a[ Maxn << 1 ];
int n, t;//t就是上面说的x
double sum, ans; int main() {
scanf( "%d", &n );
for( int i = 1; i <= n * 2; ++i ) scanf( "%lf", &a[ i ] );
for( int i = 1; i <= n * 2; ++i )
if( a[ i ] - floor( a[ i ] ) <= 1e-18 ) t++;
for( int i = 1; i <= n * 2; ++i ) sum += a[ i ] - floor( a[ i ] );
ans = 1e9;
for( int i = max( 0, t - n ); i <= min( n, t ); ++i )
ans = min( ans, abs( sum - n + i ) );
printf( "%.3lf\n", ans );
return 0;
}

CodeForces 352C Jeff and Rounding的更多相关文章

  1. CodeForces 352C. Jeff and Rounding(贪心)

    C. Jeff and Rounding time limit per test:  1 second memory limit per test: 256 megabytes input: stan ...

  2. codeforces A. Jeff and Rounding (数学公式+贪心)

    题目链接:http://codeforces.com/contest/351/problem/A 算法思路:2n个整数,一半向上取整,一半向下.我们设2n个整数的小数部分和为sum. ans = |A ...

  3. CF&&CC百套计划3 Codeforces Round #204 (Div. 1) A. Jeff and Rounding

    http://codeforces.com/problemset/problem/351/A 题意: 2*n个数,选n个数上取整,n个数下取整 最小化 abs(取整之后数的和-原来数的和) 先使所有的 ...

  4. Codeforces Round #204 (Div. 2)->C. Jeff and Rounding

    C. Jeff and Rounding time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. Codeforces Round #204 (Div. 2) C. Jeff and Rounding——数学规律

    给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小 考虑小数点后面的数字,如果这些数都非零,则就是  abs(原数小数部分相加-1*n), 多一个0 则 m ...

  6. Codeforces 351B Jeff and Furik:概率 + 逆序对【结论题 or dp】

    题目链接:http://codeforces.com/problemset/problem/351/B 题意: 给你一个1到n的排列a[i]. Jeff和Furik轮流操作,Jeff先手. Jeff每 ...

  7. codeforces B. Jeff and Periods 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/B 题目意思:给出一个长度为n的序列   a1, a2, ..., an(序号i,1 <= i ...

  8. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  9. cf C. Jeff and Rounding

    http://codeforces.com/contest/352/problem/C 题意:给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小 对每一个浮 ...

随机推荐

  1. UML表示类图和对象图

    类图表示不同的实体(人.事物和数据)如何彼此相关,显示了系统的静态结构.类图可用于表示逻辑类,逻辑类通常就是业务人员所谈及的事物种类,比如摇滚乐队.CD.广播剧,或者贷款.住房抵押.汽车信贷及利率的抽 ...

  2. c++练习之模板类的练习

    编写一维数组模板.可以无限扩展,任意数据类型,可以进行插入,删除,查找,排序等操作 #include<iostream> using std::cout; using std::cin; ...

  3. 错误:编码GBK的不可映射字符解决办法

    今天在cmd测试java代码的时候遇到了一个错误 解决办法: 输入javac  -encoding utf-8  文件名.java  原因: 由于JDK是国际版的,我们在用javac编译时,编译程序首 ...

  4. spark教程(三)-RDD认知与创建

    RDD 介绍 spark 最重要的一个概念叫 RDD,Resilient Distributed Dataset,弹性分布式数据集,它是 spark 的最基本的数据(也是计算)抽象. 代码中是一个抽象 ...

  5. Dubbo消费方服务调用过程源码分析

    参考:dubbo消费方服务调用过程源码分析dubbo基于spring的构建分析Dubbo概述--调用过程dubbo 请求调用过程分析dubbo集群容错机制代码分析1dubbo集群容错策略的代码分析2d ...

  6. java 问题汇总

    1.自动加载出错 require a bean of .... The injection point has the following annotations: - @org.springfram ...

  7. SQL数据库字段数据类型详细说明

    这里先总结数据类型.MySQL中的数据类型大的方面来分,可以分为:日期和时间.数值,以及字符串.下面就分开来进行总结. 日期和时间数据类型 MySQL数据类型 含义 date 3字节,日期,格式:20 ...

  8. 【Groovy】 Groovy笔记

    一.简单了解Groovy Groovy简介: Groovy是基于JVM的敏捷开发语言,语法与Java类似,但更加简洁,容错性也比Java强,同时Java能非常好的契合(例如Groovy能够使用Java ...

  9. IT技术网站博客推荐

    CSDN 全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台. 51CTO 技术成就梦想 - 中国领先的IT技术网站 itEye Java编程 Spring框架 Ajax技术 ag ...

  10. idea逆向生成hibernate工程

    1.创建maven工程 2.在resources下创建hibernate.cfg.xml文件 <?xml version='1.0' encoding='utf-8'?> <!DOC ...