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. buf.readInt32BE()

    buf.readInt32BE(offset[, noAssert]) buf.readInt32LE(offset[, noAssert]) offset {Number} 0 <= offs ...

  2. ubuntu jdk和tomcat配置

    先查看linux的版通过file /sbin/init命令,下载对应版本的jdk. 我的ubuntu是64位的(桌面系统),所以下载的是jdk-7u71-linux-x64.tar.gz 在home的 ...

  3. loadrunner12 + ie11 无internet, 代码中文乱码

    第一次用lr    录制的时候显示无internet, 在网上找了好久答案, 无非是ie路径设置,还有证书......   都试过了不好用,自己研究一下午 , 最后发现是协议没对应上,http协议  ...

  4. java 数组排序并去重

    https://www.cnblogs.com/daleyzou/p/9522533.htmlimport java.lang.reflect.Array;import java.util.Array ...

  5. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  6. Leetcode 86.分隔链表

    分隔链表 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1-> ...

  7. C#中的定制特性(Attributes)

    C#中的定制特性(Attributes) 介绍 Attributes是一种新的描述信息,我们既可以使用attributes来定义设计期信息(例如:帮助文件.文档的URL),还可能用attributes ...

  8. [bzoj2879][网络流,动态加边]美食节[Noi2012]

    就是bzoj1070的加强版,数据规模扩大了n倍,这样要是一次把所有边都加进去的话就爆炸了,,所以使用单路增广,增广过一条边后在加入下一条边. //By hzwer 1 #include<ios ...

  9. 【ZJOI2017 Round2练习&BZOJ4827】D1T3 gift(FFT)

    题意: 思路:可以看出题目所要最小化的是这样一个形式: 拆出每一项之后发现会变化的项只有sigma a[i]*b[i+t]与c^2,c*(a[i]-b[i]) c可以在外层枚举,剩下的只有sigma ...

  10. 理解 LARGE_INTEGER的定义

    http://bbs.csdn.net/topics/310239341 #if defined(MIDL_PASS) typedef struct _LARGE_INTEGER { #else // ...