正文

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

阅读(4179) | 评论(0)


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

评论

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