博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ #1033 - Defragment
阅读量:4988 次
发布时间:2019-06-12

本文共 2667 字,大约阅读时间需要 8 分钟。

First, 写POJ的报告用毛英文啊...

这道题思路不算难,主要参考了这里: 讲得很清楚,但是代码有点复杂,我个人觉得不需要:循环情况可以当作非循环的一个特殊情况,简单处理一下就可以了:临时cluster只保留最后一个要操作的cluster index,留在最后赋值(move)给最后一个cluster即可。这样就需要一个deque来把这个多余的操作放在栈底(push_front)。这个技巧可以大大简化代码逻辑。

另外还有个小技巧:判断一个cluster是否已经入栈,不需要一个单独的bool[],只需要把cluster数组值取负就可以了,最后输出以后再取正。

最后,如果把deque放到function里面会有segment fault,而当作global variable就没有这个问题。也就是说局部栈空间比全局栈空间要小。

奇怪的是POJ过了,但是ZOJ是WA:

//    1033//    http://www.cnblogs.com/damacheng/archive/2010/09/24/1833983.html#include 
#include
#include
using namespace std;#define MAX_N 10020deque
ops; // OJ style. Global stack is larger. Or, SegFault// Disjoint cycles, clojureint find_tmp(int n, int *cluster){ for (int i = n; i > 1; i--) { if (cluster[i] == 0) return i; }}void calc(int n, int *cluster){ int mvCnt = 0; for (int c = 1; c <= n; c++) { if (c == cluster[c] || cluster[c] == 0) continue; ops.clear(); // Pushing int n_c = c; int n_val = cluster[c]; int tmp = -1; while (n_val != 0) { // Is it cyclic? if (cluster[n_val] < 0) { tmp = find_tmp(n, cluster); ops.push_back(n_c); cluster[tmp] = -cluster[n_c]; cluster[n_c] = -tmp; ops.push_front(tmp); break; } // In stack and mark ops.push_back(n_c); cluster[n_c] *= -1; // Move to next n_c = n_val; n_val = cluster[n_val]; } // Popping for move while (!ops.empty()) { int cc = ops.back(); cluster[cc] *= -1; // Move printf("%d %d\n", cc, cluster[cc]); mvCnt++; if (cluster[cc] != tmp) // the tmp bin is special { cluster[cluster[cc]] = cluster[cc]; } cluster[cc] = 0; ops.pop_back(); } } if (mvCnt == 0) { printf("No optimization needed\n"); }}int main(){ int n, k; int cluster[MAX_N] = { 0 }; // Input int cnt = 1; scanf("%d%d", &n, &k); for (int i = 0; i < k; i++) { int currN = 0; scanf("%d", &currN); for (int j = 0; j < currN; j++) { int currInx = 0; scanf("%d", &currInx); cluster[currInx] = cnt++; } } calc(n, cluster); return 0;}
View Code

转载于:https://www.cnblogs.com/tonix/p/3848381.html

你可能感兴趣的文章
博弈论习题
查看>>
B题 hdu 1407 测试你是否和LTC水平一样高
查看>>
cglib 介绍 原理 使用 demo examples 【转】
查看>>
Ubuntu下安装LAMP及phpmyadmin
查看>>
理解OAuth 2.0
查看>>
HBase中Region, store, storefile和列簇的关系
查看>>
啥打法上
查看>>
一个简易git服务器的搭建
查看>>
cf1008 A. Romaji
查看>>
[转载]教你如何塑造JavaScript牛逼形象
查看>>
oracle nologging用法
查看>>
VC编程操作Excel
查看>>
【分享】如何设计更加“面向对象”的三层架构系统(1)
查看>>
实验五总结
查看>>
C++回调函数
查看>>
Phpstorm-Xdebug配置
查看>>
C#总结项目《影院售票系统》编写总结三
查看>>
Linux中命令行编译java接口总是提示找不到符号的疑难杂症的解决
查看>>
WF中创建持久化服务和跟踪服务数据库
查看>>
微软企业库5.0系统(一):使用缓存 Microsoft.Practices.EnterpriseLibrary.Caching(初级篇)...
查看>>