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. 个人 NABCD

    失物招领APP个人NABCD Need: 在朋友圈中,QQZone中我们长仓可以看到失物招领这方面的信息,又没有学校中专门使用的失物招领平台,所以根据这个信息,决定开发一款解决这方面问题的APP来满足 ...

  2. python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害!

    是时候给你说说 爬虫框架了 使用框架来爬取数据 会节省我们更多时间 很快就能抓取到我们想要抓取的内容 框架集合了许多操作 比如请求,数据解析,存储等等 都可以由框架完成 有些小伙伴就要问了 你他妈的 ...

  3. IE 浏览器证书错误常见问题解答

    有时,你将看到下表的错误消息,比如,此网站的安全证书已经被吊销等等,说明网站的安全证书有问题. 站点的证书允许 Internet Explorer 与站点建立安全连接. SSL证书出现错误有时是证书本 ...

  4. How to put username &password in MongoDB(Security&Authentication)?(配置用户认证在MongoDB)

    Default do not need username and password authenticate when access mongoDB ,I want to set up the use ...

  5. codevs3410 别墅房间

    题目描述 Description 小浣熊松松到他的朋友家别墅去玩,发现他朋友的家非常大,而且布局很奇怪.具体来说,朋友家的别墅可以被看做一个N*M的矩形,有墙壁的地方被标记为’#’,其他地方被标记为’ ...

  6. multiple instance of mac app

    一般情况下,mac系统上的应用程序只能启动一个实例,现在做项目,需要mac上同时启动多个实例,如何做呢,下面就说明完成这个功能的方法: 主要原理:利用 open -n Applications/XXX ...

  7. [bzoj1612][Usaco2008 Jan]Cow Contest奶牛的比赛_dfs

    Cow Contest奶牛的比赛 bzoj-1612 Usaco-2008 Jan 题目大意:题目链接. 注释:略. 想法: 我们对于每个点dfs,看一下比这个点大的点加上比这个点小的点是否是n-1即 ...

  8. codevs——1530 大质数

    1530 大质数  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师 ...

  9. Ubuntu 16.04下UML建模PowerDesigner的替代ERMaster和MySQL Workbench

    ERMaster是Eclipse的一个插件,小巧,支持连接各种数据库,还能生成代码等.安装参考:http://www.cnblogs.com/EasonJim/p/6170686.html 当然还有一 ...

  10. java int怎么转换为string

    1.两种方法,一个是再int后面+“”,就可以转为字符串. 另一个, nt i=12345;String s="";第一种方法:s=i+"";第二种方法:s=S ...