poj 3184 Finicky Grazers

http://poj.org/problem?id=3184

题意:移动奶牛的位置,使相邻两头奶牛的距离满足D或D+1,要注意第一头奶牛在第一个位置,最后一头在最后一个位置,求奶牛的移动步数;

思路:滚动数组来记录从第一头奶牛开始所在位置的最小移动步数;

代码:

View Code
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
#define max 9999999
int a[10010] = {0};
int s[2][10010] = {0};//记录第几个x+1所需最小移动步数
int n = 0;
int l = 0;
int main()
{
   scanf("%d%d",&n,&l);
   for(int i = 1;i <= n; ++i)
   scanf("%d",&a[i]);
   if(n == 1)
   {
       printf("0\n");
       return 0;
   }
   int x = l/(n - 1);
   int y = l%(n - 1);
   for(int i = 0;i <= y; ++i)
   s[0][i] = s[1][i] = max;
   s[1][0] = a[1] - 0;
   for(int i = 2;i <= n; ++i)
   {
      for(int j = 0;j <= y; ++j)
      s[0][j] = max;
      for(int j = 0;j <= y&&j <= i; ++j)
      {
          if(j > 0)
          s[0][j] = s[1][j-1]+abs(a[i] -((x+1)*(j)+(x)*(i-j-1))); //距离为x+1时
          s[0][j] = min(s[0][j],s[1][j]+abs(a[i]-(x+1)*(j)-x*(i-j-1)));//距离为x时
      }
       for(int j = 0;j <= y; ++j)
       s[1][j] = s[0][j];
   }
   printf("%d\n",s[1][y]);
   return 0;
}

我是从http://hi.baidu.com/liveroom/blog/item/58c2427af1afd1e42f73b364.html 参考的;

posted @ 2012-04-12 21:24  LT-blogs  阅读(465)  评论(0编辑  收藏  举报