[CF 351A]Jeff and Rounding[greedy]
2013-10-05 12:50
344 查看
题意:
给出一个数列, 实数的, 共有偶数项. 选出两项, 其一向上取整, 另一向下取整. 得到新的整数数列. 某种取法可以使得新旧数列之间的差的绝对值最小. 求这个最小的绝对值.
思路:
这种题关键是找出规律..
首先,随机选出一对非整数, old - new = sumof2 - 1. 由此可见, 选出一对非整数 和如何组合无关. 只要是认为某数和非整数组合, 就会有前式成立.
当选出非整数和整数组合时, 非整数可以向上取整或向下取整. 因为对于整数, 两种情况都不变. 此时 old - new = double - 0 or 1....
两种情况综合起来, 就是将所有非整数加起来, 整数相当于缓冲区... 不能缓冲的非整数只能和非整数组合, 减去这种的组合个数. 可以缓冲的就贪心, 减或不减. 需要注意, 可能一开始就是负的了, 需要最后取一下绝对值.
感觉还是图样了..><
给出一个数列, 实数的, 共有偶数项. 选出两项, 其一向上取整, 另一向下取整. 得到新的整数数列. 某种取法可以使得新旧数列之间的差的绝对值最小. 求这个最小的绝对值.
思路:
这种题关键是找出规律..
首先,随机选出一对非整数, old - new = sumof2 - 1. 由此可见, 选出一对非整数 和如何组合无关. 只要是认为某数和非整数组合, 就会有前式成立.
当选出非整数和整数组合时, 非整数可以向上取整或向下取整. 因为对于整数, 两种情况都不变. 此时 old - new = double - 0 or 1....
两种情况综合起来, 就是将所有非整数加起来, 整数相当于缓冲区... 不能缓冲的非整数只能和非整数组合, 减去这种的组合个数. 可以缓冲的就贪心, 减或不减. 需要注意, 可能一开始就是负的了, 需要最后取一下绝对值.
感觉还是图样了..><
#include <cstring> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; const double EPS = 1e-5; const int MAXN = 4005; int n,num; double a[MAXN]; int main() { num = 0; scanf("%d",&n); double sum = 0; for(int i=0;i<2*n;i++) { double tmp; scanf("%lf",&tmp); if(fabs(tmp - (int)tmp)<EPS) continue; a[++num] = tmp - (int)tmp; sum += a[num]; } if(!num) { printf("0.000\n"); return 0; } int rest = 2*n - num; int sub = 2*n - 2*rest; if(sub<0) sub = 0; sub >>= 1; sum -= sub; double ans = sum; for(int i=1;i<=rest;i++) { ans = min(ans, fabs(sum-i)); } ans = fabs(ans); printf("%.3lf\n",ans); }
相关文章推荐
- MmReMapSpace
- JBoss 系列三:使用4种方式部署应用到JBoss7/WildFly
- eclipse debug时的display视图
- Children of the Candy Corn
- 复杂点的查询
- Cursor 引起的android程序崩溃异常解决方法
- 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.2 安装数据库软件)
- IT界需求最旺的16项技能
- 4-3
- strace使用详解
- c++中多线程编程是不是线程数越多越好?
- 利用lua_pcall()的errfunc参数调试LUA程序
- #ifndef、#define、#endif
- 一个简单的c++写日志类
- Java heap dump触发和分析(转)
- 快排为什么那样快
- JQueryEasyUI-DataGrid显示数据,条件查询,排序及分页
- (.text+0x5e2):对‘pthread_create’未定义的引用
- 例4-4
- 例4-3