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 ;
}

最新文章

  1. 数据源DBCP一二
  2. 8月3日奥威Power-BI V11 视频交流开课啦!
  3. HDU-4751 Divide Groups 染色问题
  4. 第八条——覆盖equals方法时需遵守的通用约定
  5. hdu 3911 Black And White(线段树)
  6. 为什么解析 array_column不可用,
  7. 浏览器根对象window之screen
  8. 自定义 Cordova插件详解
  9. 简述nginx(1)
  10. Number Sequence kmp
  11. 一个tomcat服务器上部署多个Web项目,不同域名访问
  12. Linux上配置http上网代理
  13. [UWP]缓存Lottie动画帧
  14. Lucene源码
  15. PYTHON-匿名函数,递归与二分法,面向过程编程-练习
  16. RabbitMQ系列教程之六:远程过程调用(RPC)(转载)
  17. jvm垃圾回收的过程
  18. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
  19. iOS 在object-c 中调用c文件 方法
  20. CSS属性中display=&quot;none“与visibility=&quot;hidden&quot;的不同

热门文章

  1. Keil uVision “已停止工作”
  2. photon Unity RPC 调用流程
  3. Dubbo 是一个分布式服务框架
  4. 最小生成树 B - Networking
  5. 7、Java并发性和多线程-如何创建并运行线程
  6. Oracle Multitenant Environment (五) Create PDB
  7. WebDev.WebServer40.EXE
  8. 编程规范(一 之kmalloc,fflush,fclose,char_init)
  9. [Vue @Component] Pass Vue Render Functions as Props for Powerful Patterns
  10. Linux经常使用命令-文件搜索命令-文件搜索命令find