poj 3184 Finicky Grazers
http://poj.org/problem?id=3184
题意:移动奶牛的位置,使相邻两头奶牛的距离满足D或D+1,要注意第一头奶牛在第一个位置,最后一头在最后一个位置,求奶牛的移动步数;
思路:滚动数组来记录从第一头奶牛开始所在位置的最小移动步数;
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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 参考的;