题意

有一个含有\(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. Django中ORM操作提升性能

    提升orm操作性能注意的点 优化一:尽量不查对象,能用values就是用values 直接使用对象查询的结果是5条sql语句 def youhua(request): # 使用对象查 obj_list ...

  2. 求问:numpy里面索引时,采用整型数组和整型列表的区别!

  3. vue-router和webpack懒加载,页面性能优化篇

    在vue单页应用中,当项目不断完善丰富时,即使使用webpack打包,文件依然是非常大的,影响页面的加载.如果我们能把不同路由对应的组件分割成不同的代码块,当路由被访问时才加载对应的组件(也就是按需加 ...

  4. Python-RabbitMQ-fanout(广播模式)

    生产者:fanout_publiser.py import pika import sys connection = pika.BlockingConnection(pika.ConnectionPa ...

  5. oa_mvc_easyui_详细页(5)

    1.表格详细列中添加a标签,给id参数 <a href="javascript:void(0)" class="details" ids="@n ...

  6. C#控制台输入/输出语句

    Console.Read()方法:          从控制台窗口读取一个字符,返回int值 Console.ReadLine()方法:    从控制台窗口读取一行文本,返回string值 Conso ...

  7. linux端口控制(开放-禁止)

    禁止访问80端口iptables -I INPUT -p tcp --dport 80 -j DROP 允许ip为192.168.1.1的机器访问iptables -I INPUT -p tcp -s ...

  8. openlayers之地图截图

    方法1 //this.map._this为初始化地图对象 this.map._this.once('postcompose', function (event) { var canvas = even ...

  9. OpenSSL(2)创建私有证书颁发机构

    如果想要建立自己的CA, OpenSSL已经包含了所有你需要的东西.所有的操作都通过纯命令行执行,虽然不那么友好,整个过程也比较长,但是这可以让你去思考每个细节. 我建议自己创建一套私有的 CA主要是 ...

  10. 服务命令(systemctl的使用)

    常用的service与systemctl命令的对比 应用举例: ●start:开启服务 ●stop:停止服务 ●status:参数来查看服务运行情况 ●restart:重新加载服务 应用举例·: #启 ...