2012 2012 Multi-University Training Contest 7 Dragon Ball
2012-08-14 20:13
351 查看
如此简单的题目,让我们两个一直卡到最后也没搞出来,我的二分写惨了,他的游标也写错了。现在给出比较靠谱的写法,在下一层定位的时候,把上一层和下一层的合并排序后进行处理,当然这样的方法对于离线的非常有效,在线的还必须得二分,当然二分很纠结。 /* * File: main.cpp * Author: hit-acm * * Created on 2012年8月14日, 下午1:14 */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <bitset> using namespace std; const int MAXM = 105; const int MAXN = 1010; const long long INF = 0x7fffffffffffffffLL; int m, n, x; long long t1[MAXN]; long long t2[MAXN]; struct Dragon { long long val; long long x; long long dp; bool operator<(const Dragon & a)const { return x < a.x; } } mat[MAXM][MAXN]; struct sort_index { int index; long long x; bool color; bool operator<(const sort_index & a)const { return x < a.x; } } temp[2 * MAXN]; long long solve() { for (int i = 0; i < m; i++) { sort(mat[i], mat[i] + n); } for (int i = 0; i < n; i++) { mat[0][i].dp = mat[0][i].val + abs(mat[0][i].x - x); } for (int i = 1; i < m; i++) { for (int k = 0; k < n; k++) { temp[k].x = mat[i - 1][k].x; temp[k].index = k; temp[k].color = true; temp[n + k].x = mat[i][k].x; temp[n + k].index = k; temp[n + k].color = false; } sort(temp, temp + 2 * n); long long min_dis = INF; for (int k = 0; k < 2 * n; k++) { if (temp[k].color == true) { min_dis = min(min_dis, mat[i - 1][temp[k].index].dp - temp[k].x); } else { t1[temp[k].index] = min_dis; } } min_dis = INF; for (int k = 2 * n - 1; k >= 0; k--) { if (temp[k].color == true) { min_dis = min(min_dis, mat[i - 1][temp[k].index].dp + temp[k].x); } else { t2[temp[k].index] = min_dis; } } for (int j = 0; j < n; j++) { mat[i][j].dp = INF; if (t1[j] != INF) { mat[i][j].dp = min(mat[i][j].dp, mat[i][j].x + t1[j]); } if (t2[j] != INF) { mat[i][j].dp = min(mat[i][j].dp, -mat[i][j].x + t2[j]); } mat[i][j].dp += mat[i][j].val; } } long long res = mat[m - 1][0].dp; for (int i = 1; i < n; i++) { res = min(res, mat[m - 1][i].dp); } return res; } int main() { int T; scanf("%d", &T); while (T--) { scanf("%d%d%d", &m, &n, &x); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%lld", &mat[i][j].x); } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%lld", &mat[i][j].val); } } printf("%lld\n", solve()); } return 0; }
相关文章推荐
- 2012 Multi-University Training Contest 7-1003 hdu4362 Dragon Ball
- hdu 4340 Capturing a country(树形DP) 2012 Multi-University Training Contest 5
- 2012 Multi-University Training Contest 4-1001 hdu4331 Image Recognition
- hdu4366-successor-2012 Multi-University Training Contest 7-1007
- hdu 4360 As long as Binbin loves Sangsang (最短路 2012 Multi-University Training Contest 7 )
- hdu 4366 Successor (线段树 2012 Multi-University Training Contest 7 )
- hdu 4393 Throw nails (2012 Multi-University Training Contest 10 )
- 2012 Multi-University Training Contest 3
- HDU 4322 最大费用最大流 2012 Multi-University Training Contest 3
- 2012 Multi-University Training Contest 5-1004 hdu4342
- hdu 4385 Moving Bricks (状态压缩dp 2012 Multi-University Training Contest 9 )
- 4372 Count the Buildings(2012 Multi-University Training Contest 8)第一类strling数
- 2012 Multi-University Training Contest 9 / hdu4389
- 2012 Multi-University Training Contest 5-1007 hdu4345
- hdu 4362 Dragon Ball(dp + 优化) (2012 Multi-University Training Contest 7 )
- HDU 4342 History repeat itself 2012 Multi-University Training Contest 5
- 2012 Multi-University Training Contest 1
- 2012 Multi-University Training Contest 2
- 2012 Multi-University Training Contest 5-1011 hdu4349
- 2012 Multi-University Training Contest 3