正文

Zju 1524 Supermarket2006-08-06 15:46:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/17334.html

分享到:

2003120 2006-08-06 15:30:49 Accepted 1524 C++ 00:00.27 400K St.Crux

这个题是典型的dp。n = 100, m = 100000,一开始打算对m进行dp,结果显然超时。后来看了几个帖子,明白是对n进行dp,以每一步的总和为状态转移,方程如下:

p(N) = min(p(N - 1) + di, p(N))           p(N) ≠ 0 

            di                                                p(N) = 0

#include <cstdio>
#include <string>

double a[100];
int b[100], n, m, mx, tmx;

int main()
{
 int i, k;
 //freopen("in.txt", "r", stdin);
 while(scanf("%d %d", &n, &m) && n)
 {
  memset(a, 0, sizeof(a));
  for(i = 0; i < n; i ++)
  {
   scanf("%d", &b[i]);
  }
  mx = 0, tmx = mx;
  for(i = 0; i < m; i ++)
  {
   int ti; double td;
   scanf("%d %lf", &ti, &td);
   mx = tmx;
   for(k = mx; k >= 0; k --)
   {
    if(ti == b[k])
    {
     if(a[k] == 0 || a[k - 1] + td < a[k])
     {
      a[k] = td + a[k - 1];
      if(k == mx && mx < n - 1)
       tmx = mx + 1;
     }
    }
   }
  }
  if(a[n - 1] != 0)
   printf("%0.2f\n", a[n - 1]);
  else
   printf("Impossible\n");
 }
 return 0;
}

阅读(3574) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册