CF 351A - Jeff and Rounding DP
http://codeforces.com/problemset/problem/351/C
题意:有2*n个浮点数a1,a2,a3...a2*n,把他们分成n队,对于每对<A,B>,对A做floor() 操作,对B 做ceil()操作。生成b1...b2*n, 求|(b1+b2+...+b2*n)-(a1+a2+a3...+a2*n)|的最小值。
对于每个数ai,对他们做floor()的cost是up()=ai-floor(ai) ,做ceil()的cost是down()=ceil(ai)-ai
设f[i][j]表示前i个节点有j个做ceil()操作(i-j个floor())的最优值
f[i][j]=min{f[i-1][j-1]+up(a[i]), 对ai做up()的代价
f[i-1][j]+down(a[i])} 对ai做down()的代价、
当i == j时注意f[i-1][j]不存在这种情况.
这里的min{}里面比较的是绝对值。、
临界值f[0][0]=0; f[0][1]=0;目标答案|f[2*n][n]|。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 2001
double min(double a,double b)
{
return fabs(a)>fabs(b)? b:a;
}
double up(double x)
{
return ceil(x)-x;
}
double down(double x)
{
return x-floor(x);
}
double a[*N+];
double f[*N+][N+];
int main()
{
int i,j,m,n;
while (scanf("%d",&n)!=EOF)
{
for (i=;i <=*n; i++)
scanf("%lf",&a[i]);
f[][]=;
f[][]=;
double tmp;
for (i=;i<=*n; i++)
for (j=; j<= n && j<=i;j++)
{
tmp=;
if (i>j) tmp=f[i-][j]+down(a[i]);
if (j>)
tmp=min(tmp,f[i-][j-]-up(a[i]));
f[i][j]=tmp;
} printf("%0.3lf\n",fabs(f[*n][n]));
}
return ;
}
好吧,其实仔细看看就是一个背包。
我们可以把i 这个维度,在空间上优化点。跟0/1背包似的。
f[j]=min{f[j-1]+up(a[i]),f[j]+down(a[i])}
不过j循环得downto了,因为f[j-1]在迭代前,还应该是f[i-1][j-1]这个状态,而不是f[i][j-1]了。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 2001
//#define min(a,b) a>b?b:a
double min(double a,double b)
{
return fabs(a)>fabs(b)? b:a;
}
double up(double x)
{
return ceil(x)-x;
}
double down(double x)
{
return x-floor(x);
}
double a[*N+];
double f[N+];
int main()
{
int i,j,m,n;
while (scanf("%d",&n)!=EOF)
{
for (i=;i <=*n; i++)
scanf("%lf",&a[i]);
f[]=; f[]=;
double tmp;
for (i=;i<=*n; i++)
for (j=min(i,n);j>=;j--)
{
tmp=;
if (i>j) tmp=f[j]+down(a[i]);
if (j>)
tmp=min(tmp,f[j-]-up(a[i]));
f[j]=tmp;
//f[i][j]=min(f[i-1][j-1]+up(a[i]),f[i-1][j]+down(a[i]));
}
printf("%0.3lf\n",fabs(f[n]));
}
return ;
}
CF 351A - Jeff and Rounding DP的更多相关文章
- cf C. Jeff and Rounding
http://codeforces.com/contest/352/problem/C 题意:给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小 对每一个浮 ...
- CF&&CC百套计划3 Codeforces Round #204 (Div. 1) A. Jeff and Rounding
http://codeforces.com/problemset/problem/351/A 题意: 2*n个数,选n个数上取整,n个数下取整 最小化 abs(取整之后数的和-原来数的和) 先使所有的 ...
- 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 ...
- CodeForces 352C. Jeff and Rounding(贪心)
C. Jeff and Rounding time limit per test: 1 second memory limit per test: 256 megabytes input: stan ...
- CF 983B XOR-pyramid(区间dp,异或)
CF 983B XOR-pyramid(区间dp,异或) 若有一个长度为m的数组b,定义函数f为: \(f(b) = \begin{cases} b[1] & \quad \text{if } ...
- CF 9D. How many trees?(dp)
题目链接 以前做过类似的,USACO,2.3,开始数组开小了,导致数据乱了,然后超数据范围了,.. #include <cstdio> #include <iostream> ...
- CF 346B. Lucky Common Subsequence(DP+KMP)
这题确实很棒..又是无想法..其实是AC自动机+DP的感觉,但是只有一个串,用kmp就行了. dp[i][j][k],k代表前缀为virus[k]的状态,len表示其他所有状态串,处理出Ac[len] ...
- CF 55D. Beautiful numbers(数位DP)
题目链接 这题,没想出来,根本没想到用最小公倍数来更新,一直想状态压缩,不过余数什么的根本存不下,看的von学长的blog,比着写了写,就是模版改改,不过状态转移构造不出,怎么着,都做不出来. #in ...
- CF 149D Coloring Brackets 区间dp ****
给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2.每对括号必须只能给其中的一个上色 3.相邻的两个不能上同色,可以都不上色 求0-len-1这一区间内 ...
随机推荐
- 虚拟机下Linux网络配置
之前配置好了linux系统,在网络这块我用的是桥接模式. 现在分享一下使用虚拟机桥接模式配置Linux网络的过程. 一.首先配置外网的本地Ip地址. 二.配置Linux 网络链接 1.打开linux网 ...
- 匹配 C 语言样式字符串
#include <stdio.h> char haha[] = "nihaoma" "niubi" "\"hello worl ...
- hdu 1754 I Hate It(线段树水题)
>>点击进入原题测试<< 思路:线段树水题,可以手敲 #include<string> #include<iostream> #include<a ...
- https://gitee.com/tomsun28/bootshiro-------需要研究的项目
https://gitee.com/tomsun28/bootshiro-------需要研究的项目
- MongoDB增加用户、删除用户、修改用户读写权限及只读权限(注:转载于http://www.2cto.com/database/201203/125025.html)
MongoDB 增加用户 删除用户 修改用户 读写权限 只读权限, MongoDB用户权限分配的操作是针对某个库来说的.--这句话很重要. 1. 进入ljc 数据库: use ...
- nyoj_79_拦截导弹_201403182040
拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...
- MySQL慢日志切割邮件发送脚本
#!/bin/bashtime=`date -d yesterday +"%Y-%m-%d"`slowlog='/usr/local/percona/data/slow.log'# ...
- 【Android】自己定义圆形ImageView(圆形头像 可指定大小)
近期在仿手Q的UI,这里面常常要用到的就是圆形头像,看到 在android中画圆形图片的几种办法 这篇文章,了解了制作这样的头像的原理.只是里面提供的方法另一个不足的地方就是不能依据实际需求改变图片的 ...
- 去除ckeditor上传图片预览中的英文字母
去除ckeditor上传图片预览中的英文字母 CKEDITOR.replace('text', { filebrowserImageUploadUrl : 'upload_img.do', langu ...
- Spark SQL CLI 实现分析
背景 本文主要介绍了Spark SQL里眼下的CLI实现,代码之后肯定会有不少变动,所以我关注的是比較核心的逻辑.主要是对照了Hive CLI的实现方式,比較Spark SQL在哪块地方做了改动,哪些 ...