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的更多相关文章

  1. cf C. Jeff and Rounding

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

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

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

  3. 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 ...

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

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

  5. CF 983B XOR-pyramid(区间dp,异或)

    CF 983B XOR-pyramid(区间dp,异或) 若有一个长度为m的数组b,定义函数f为: \(f(b) = \begin{cases} b[1] & \quad \text{if } ...

  6. CF 9D. How many trees?(dp)

    题目链接 以前做过类似的,USACO,2.3,开始数组开小了,导致数据乱了,然后超数据范围了,.. #include <cstdio> #include <iostream> ...

  7. CF 346B. Lucky Common Subsequence(DP+KMP)

    这题确实很棒..又是无想法..其实是AC自动机+DP的感觉,但是只有一个串,用kmp就行了. dp[i][j][k],k代表前缀为virus[k]的状态,len表示其他所有状态串,处理出Ac[len] ...

  8. CF 55D. Beautiful numbers(数位DP)

    题目链接 这题,没想出来,根本没想到用最小公倍数来更新,一直想状态压缩,不过余数什么的根本存不下,看的von学长的blog,比着写了写,就是模版改改,不过状态转移构造不出,怎么着,都做不出来. #in ...

  9. CF 149D Coloring Brackets 区间dp ****

    给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2.每对括号必须只能给其中的一个上色 3.相邻的两个不能上同色,可以都不上色 求0-len-1这一区间内 ...

随机推荐

  1. dstat系统分析工具的使用

    1.安装 方法一:yum #yum install -y dstat 方法二:rpm 官网下载地址: http://dag.wieers.com/rpm/packages/dstat #wget ht ...

  2. Spring 使用注解注入 学习(四)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. MongoDB增加用户、删除用户、修改用户读写权限及只读权限(注:转载于http://www.2cto.com/database/201203/125025.html)

    MongoDB  增加用户 删除用户  修改用户  读写权限 只读权限,   MongoDB用户权限分配的操作是针对某个库来说的.--这句话很重要.   1. 进入ljc 数据库:       use ...

  4. ACE in Action

    ACE in Action https://cdn.xgqfrms.xyz/web-ide/index.html TinyMCE https://panjiachen.github.io/vue-el ...

  5. java虚拟机(三)-- 虚拟机类加载机制

    1.类加载的时机:类从被加载到虚拟机内存中开始,到卸载出内存为止.包含以下几个阶段: 1.加载 2.验证 3.准备 4.解析 5.初始化 6.使用 7.卸载 2.类加载器的种类 1.启动类加载器:这个 ...

  6. ms sql SERVER 下载

    企业版DVD SQL Server 2005 Enterprise Edition(支持超大型企业) 32 位DVD: ed2k://|file|cs_sql_2005_ent_x86_dvd.iso ...

  7. JobHistory搜索智能化

    前言 做过hadoop集群问题排查工作的同学一定用过JobHistory,这是一个非常好用的"利器",为什么这么说呢?正如这个工具的名称所叫的那样,这个工具能帮你找到历史Job跑过 ...

  8. 国际维修联合会IMA年度大会在瑞士圆满结束

    瑞士卢加诺 ☆2016年4月5日至7日 中国设备管理协会国际交流合作中心主任.学府咨询(国际)集团董事长.IMA中国分会主席李葆文教授,应邀出席了4月5日至7日在瑞士卢加诺召开的国际维修联合会年度大会 ...

  9. LeetCode 893. Groups of Special-Equivalent Strings (特殊等价字符串组)

    题目标签:String 题目可以让在 偶数位置的 chars 互换, 也可以让 在 奇数位置的 chars 互换. 所以为了 return 正确的 group 数量,需要把 那些重复的 给排除掉. 可 ...

  10. LeetCode 387. First Unique Character in a String (字符串中的第一个唯一字符)

    题目标签:String, HashMap 题目给了我们一个 string,让我们找出 第一个 唯一的 char. 设立一个 hashmap,把 char 当作 key,char 的index 当作va ...