hdu 5402 Travelling Salesman Problem 模拟构造
来源:互联网 发布:黑魂3dlc武器数据 编辑:程序博客网 时间:2024/06/06 07:02
题意:n*m的矩阵,从1 1走到n,m,每个点只走一次,求到终点路过点之和的最大值,并输出路径。
可得当nm中有奇数时一定能全部走完,来看nm为偶数时,若某个格子值最小且坐标ij之和为偶数,模拟一下之和发现无论怎么走,必然有两个坐标之和为奇数的点无法走到;再来看,某格子坐标和为奇数的,若不经过它,则一定能遍历完整个图。相比之下,选一个值最小的偶数格子+两个奇数格子,肯定要比选一个坐标为奇数的格子大。那么肯定走奇数且值最小的格子了。最后模拟一下怎么走就行了。
#include <bits/stdc++.h>#include <map>#include <set>#include <queue>#include <stack>#include <cmath>#include <time.h>#include <vector>#include <cstdio>#include <string>#include <iomanip>///cout << fixed << setprecision(13) << (double) x << endl;#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1#define ls rt << 1#define rs rt << 1 | 1#define pi acos(-1.0)#define eps 1e-8#define Mp(a, b) make_pair(a, b)#define asd puts("asdasdasdasdasdf");typedef long long ll;typedef pair <int, int> pl;//typedef __int64 LL;const int inf = 0x3f3f3f3f;const int N = 110;int n, m;int t[N][N];string s;void f( int x, int y ){ s = ""; if( y == 1 ) { if( x != n ) { for( int i = 1; i < x; ++i ) { if( i % 2 ) { for( int j = 1; j < m; ++j ) s += 'R'; } else { for( int j = 1; j < m; ++j ) s += 'L'; } s += 'D'; } for( int i = 1; i < m; ++i ) { if( i % 2 ) { s += 'D'; } else { s += 'U'; } s += 'L'; } s += 'D'; for( int i = x+2; i <= n; ++i ) { if( i % 2 == 0 ) { for( int j = 1; j < m; ++j ) s += 'R'; } else { for( int j = 1; j < m; ++j ) s += 'L'; } if ( i != n ) s += 'D'; } } else { for( int i = 1; i < x-1; ++i ) { if( i % 2 ) { for( int j = 1; j < m; ++j ) s += 'R'; } else { for( int j = 1; j < m; ++j ) s += 'L'; } s += 'D'; } for( int i = 1; i < m; ++i ) { s += 'R'; if( i % 2 ) s += 'D'; else s += 'U'; } } } else if( x == 1 ) { if( y != m ) { for( int i = 1; i < y; ++i ) { if( i % 2 ) { for( int j = 1; j < n; ++j ) s += 'D'; } else { for( int j = 1; j < n; ++j ) s += 'U'; } s += 'R'; } for( int i = 1; i < n; ++i ) { if( i % 2 ) { s += 'R'; } else { s += 'L'; } s += 'U'; } s += 'R'; for( int i = y+2; i <= m; ++i ) { if( i % 2 == 0 ) { for( int j = 1; j < n; ++j ) s += 'D'; } else { for( int j = 1; j < n; ++j ) s += 'U'; } if ( i != m ) s += 'R'; } } else { for( int i = 1; i < m-1; ++i ) { if( i % 2 ) { for( int j = 1; j < n; ++j ) s += 'D'; } else { for( int j = 1; j < n; ++j ) s += 'U'; } s += 'R'; } for( int i = 1; i < n; ++i ) { s += 'D'; if( i % 2 ) s += 'R'; else s += 'L'; } } } else if( y == m ) { for( int i = 1; i < x; ++i ) { if( i % 2 ) { for( int j = 1; j < m; ++j ) { s += 'R'; } } else { for( int j = 1; j < m; ++j ) { s += 'L'; } } s += 'D'; } for( int i = 1; i < m; ++i ) { if( i % 2 ) s += 'D'; else s += 'U'; s += 'R'; } for( int i = x+2; i <= n; ++i ) { s += 'D'; if( i % 2 ) { for( int j = 1; j < m; ++j ) s += 'L'; } else { for( int j = 1; j < m; ++j ) s += 'R'; } } } else if( x == n ) { for( int i = 1; i < y; ++i ) { if( i % 2 ) { for( int j = 1; j < n; ++j ) s += 'D'; } else { for( int j = 1; j < n; ++j ) s += 'U'; } s += 'R'; } for( int i = 1; i < n; ++i ) { if( i % 2 ) { s += 'R'; } else { s += 'L'; } s += 'D'; } for( int i = y+2; i <= m; ++i ) { s += 'R'; if( i % 2 ) { for( int j = 1; j < n; ++j ) s += 'U'; } else { for( int j = 1; j < n; ++j ) s += 'D'; } } } else { if( y % 2 == 0 ) { for( int i = 1; i < x; ++i ) { if( i % 2 ) { for( int j = 1; j < m; ++j ) s += 'R'; } else { for( int j = 1; j < m; ++j ) { s += 'L'; } } s += 'D'; } for( int i = 1; i < y; ++i ) { if( i % 2 ) { s += 'D'; } else { s += 'U'; } s += 'R'; } for( int i = y+1; i <= m; ++i ) { s += 'R'; if( i % 2 ) s += 'U'; else s += 'D'; } for( int i = x+2; i <= n; ++i ) { s += 'D'; if( i % 2 ) { for( int j = 1; j < m; ++j ) s += 'L'; } else { for( int j = 1; j < m; ++j ) s += 'R'; } } } else if( x % 2 == 0 ) { for( int i = 1; i < y; ++i ) { if( i % 2 ) { for( int j = 1; j < n; ++j ) { s += 'D'; } } else { for( int j = 1; j < n; ++j ) { s += 'U'; } } s += 'R'; } for( int i = 1; i < x; ++i ) { if( i % 2 ) { s += 'R'; } else { s += 'L'; } s += 'D'; } for( int i = x+1; i <= n; ++i ) { s += 'D'; if( i % 2 ) { s += 'L'; } else { s += 'R'; } } for( int i = y+2; i <= m; ++i ) { s += 'R'; if( i % 2 ) { for( int j = 1; j < n; ++j ) s += 'U'; } else { for( int j = 1; j < n; ++j ) s += 'D'; } } } } cout << s << endl;}int main(){ while( ~scanf("%d%d", &n, &m) ) { int ans = 0, tmp = inf, x = 0, y = 0, c; for( int i = 1; i <= n; ++i ) { for( int j = 1; j <= m; ++j ) { scanf("%d", &c); t[i][j] = c; if( (i + j) % 2 == 1 ) { if( c < tmp ) { x = i, y = j, tmp = c; } } ans += c; } } if( m % 2 ) { string s = ""; for( int i = 1; i <= m; ++i ) { if( i % 2 ) { for( int j = 1; j < n; ++j ) s += 'D'; } else { for( int j = 1; j < n; ++j ) s += 'U'; } if( i != m ) s += 'R'; } printf("%d\n", ans); cout << s << endl; } else if( n % 2 ) { string s = ""; for( int i = 1; i <= n; ++i ) { if( i % 2 ) { for( int j = 1; j < m; ++j ) s += 'R'; } else { for( int j = 1; j < m; ++j ) s += 'L'; } if( i != n ) s += 'D'; } printf("%d\n", ans); cout << s << endl; } else { //printf("x: %d y: %d\n", x, y); printf("%d\n", ans - t[x][y]); f( x, y ); } } return 0;}/*4 42 2 2 22 2 2 22 2 2 21 2 2 2*/
刷了300+还是有点爽
0 0
- hdu 5402 Travelling Salesman Problem 模拟构造
- hdu 5402 Travelling Salesman Problem(构造+模拟)
- 【HDU 5402】Travelling Salesman Problem(构造)
- HDU 5402 (构造题)Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem (构造)
- hdu 5402 Travelling Salesman Problem(构造)
- Travelling Salesman Problem (hdu 5402 模拟)
- HDU-5402 Travelling Salesman Problem(模拟)
- HDU 5402 Travelling Salesman Problem
- HDU 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)
- HDU 5402 Travelling Salesman Problem (构造)(好题)
- hdu 5402 Travelling Salesman Problem(构造+棋盘黑白染色)
- HDU 5402 Travelling Salesman Problem(组合数学+构造)
- HDU 5402 Travelling Salesman Problem(多校9 模拟)
- HDU 4715 Difference Between Primes
- 详解MySQL中EXPLAIN解释命令
- C++笔记之常量与如何赋值
- PAT 1048. Find Coins (25)
- 学习如何避免10种最常见的C#误区
- hdu 5402 Travelling Salesman Problem 模拟构造
- 九度OJ 题目1074:对称平方数
- crontab 不能开启,且报错`/var/run.bak/crond.pid': Input/output error
- jquery的each()详细介绍
- VS2010版最常用的快捷键和其他快捷键
- Struts2中的OGNL表达式
- Android应用的自动升级、更新模块的实现完整方案+参考程序
- hdu5392
- 经典SQL语句集锦