UVa Live Archive 2326 - Moving Tables
2014-06-20 17:42
344 查看
传送门UVa Live Archive 2326 - Moving Tables
题意:给出几个搬桌子的情况,求最小用时。
注意如果从4→7,3→8的路都不能用了。
还有一点不太清楚,我觉得排序和不排序都一样,不排序就WA了。。奇怪。以后再来慢慢探究。
不明白为什么选择这个贪心策略是对的,看到了某个大神的证明。引用一下,备忘,日后研究。
引用自PhoenixDead
有四种贪心策略:最短优先,最长优先,最早开始时间优先,最早结束时间优先。活动安排问题采用的是最早结束时间优先。此题要求所有活动都被安排,直观的想同时进行的活动相互之间的间隔最小最好。可以证明最早开始时间优先满足要求。
证明:令S = P1,P2,P3,P4,P5是满足最早开始时间优先的一轮安排。即P1是所有活动中最早开始的,P2是在P1结束之后才开始的所有活动中最早开始的,依次类推。
假设存在最优解A不包含上述S的安排。我们要证明存在一个等价的最优解A‘包含上述的S安排。
由于P1是所有活动中最早开始的,所以A中必存在以P1开始的一轮安排,令为T = P1, T2, T3, T4,...Tn。
同时在A中,令包含 P2的一轮安排为B = B1,B2,...,P2,Bk,Bk+1,.. Bm。
由与P2是与P1相容活动中最早开始的,所以可以交换T2, T3, T4,...Tn与P2,Bk,Bk+1,.. Bm。得到新的安排T‘ = P1,P2,Bk,Bk+1,.. Bm和B' = B1,B2,...,T2, T3, T4,...Tn。
继续寻找包含P3的安排,依次类推,可以得到包含S的一个最优解A'。所以,任何最优解都可以转换为使用最早开始时间优先构造的解。证毕。
题意:给出几个搬桌子的情况,求最小用时。
注意如果从4→7,3→8的路都不能用了。
还有一点不太清楚,我觉得排序和不排序都一样,不排序就WA了。。奇怪。以后再来慢慢探究。
不明白为什么选择这个贪心策略是对的,看到了某个大神的证明。引用一下,备忘,日后研究。
引用自PhoenixDead
有四种贪心策略:最短优先,最长优先,最早开始时间优先,最早结束时间优先。活动安排问题采用的是最早结束时间优先。此题要求所有活动都被安排,直观的想同时进行的活动相互之间的间隔最小最好。可以证明最早开始时间优先满足要求。
证明:令S = P1,P2,P3,P4,P5是满足最早开始时间优先的一轮安排。即P1是所有活动中最早开始的,P2是在P1结束之后才开始的所有活动中最早开始的,依次类推。
假设存在最优解A不包含上述S的安排。我们要证明存在一个等价的最优解A‘包含上述的S安排。
由于P1是所有活动中最早开始的,所以A中必存在以P1开始的一轮安排,令为T = P1, T2, T3, T4,...Tn。
同时在A中,令包含 P2的一轮安排为B = B1,B2,...,P2,Bk,Bk+1,.. Bm。
由与P2是与P1相容活动中最早开始的,所以可以交换T2, T3, T4,...Tn与P2,Bk,Bk+1,.. Bm。得到新的安排T‘ = P1,P2,Bk,Bk+1,.. Bm和B' = B1,B2,...,T2, T3, T4,...Tn。
继续寻找包含P3的安排,依次类推,可以得到包含S的一个最优解A'。所以,任何最优解都可以转换为使用最早开始时间优先构造的解。证毕。
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int MAXN = 200 + 10; struct DESK { int start, target; friend bool operator < (const DESK &a, const DESK &b) { return a.start < b.start; } }desk[MAXN]; int vis[MAXN]; vector<int> curUsing; int main() { //freopen("input.txt", "r", stdin); //freopen("Correct.txt", "w", stdout); int T, i, j, n, cnt, ans, a, b; scanf("%d", &T); while (T--) { memset(vis, 0, sizeof(vis)); cnt = ans = 0; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d%d", &a, &b); desk[i].start = min(a, b); desk[i].target = max(a, b); } sort(desk, desk + n); while (cnt < n) { ans += 10; for (i = 0; i < n; i++) { if (!vis[i]) { for (j = 0; j < curUsing.size(); j += 2) { int s = desk[i].start, t = desk[i].target; if (s >= curUsing[j] && s <= curUsing[j + 1] || t >= curUsing[j] && t <= curUsing[j + 1]) break; } if (j >= curUsing.size()) { cnt++; if (!(desk[i].start % 2)) curUsing.push_back(desk[i].start - 1); else curUsing.push_back(desk[i].start); if (desk[i].target % 2) curUsing.push_back(desk[i].target + 1); else curUsing.push_back(desk[i].target); vis[i] = 1; } } } curUsing.clear(); } printf("%d\n", ans); } return 0; }
相关文章推荐
- UVALive 2326 Moving Tables(贪心+不相交区间问题)
- uvalive 2326 - Moving Tables(区间覆盖问题)
- uvalive 2326 - Moving Tables(区间覆盖问题)
- UVAlive 2326 Moving Tables(贪心 + 区间问题)
- UVALive - 2326 Moving Tables 贪心
- UVALive 2326 Moving Tables 贪心
- UVAlive 2326 Moving Tables(贪心 + 区间问题)
- uvalive 2326 - Moving Tables(区间覆盖问题)
- UVAlive 2326 Moving Tables(贪心 + 区间问题)
- POJ1083 HDU1050 ZOJ1029 UVALive2326 Moving Tables【序列+最值】
- UVALive - 3703 Billing Tables Tire、字典树
- UVa Live Archive 3971 & UVa 12124 & POJ 3497 - Assemble
- UVA Live Archive的一个坑点
- UVALive 3703 (LA 3703) Billing Tables Trie树
- UVALive 4614 Moving to Nuremberg(树形DP)
- UVa Live Archive 2322 - Wooden Sticks
- UVALive Archive - 6196 - Party Games
- UVA Live 6122 || UESTC OJ 2326 枚举+排序+LIS
- UVALive - 4614 Moving to Nuremberg (树形DP)
- UVa Live Archive 3635 & POJ 3122 - Pie