UVA - 514 Rails
2015-10-29 15:44
483 查看
#include <cstdio>
#include <stack>
using namespace std;
const int MAXN = 1000 + 10;
int n, target[MAXN];
int main()
{
while(~scanf("%d", &n) && n)
{
while(~scanf("%d", &target[1]) && target[1])
{
stack<int> s;
int A = 1, B = 1;
for(int i = 2; i <= n; i++)
scanf("%d", &target[i]);
int ok = 1;
while(B <= n)
{
if(A == target[B]) { A++; B++; } //若满足输入所示要求,则直接到B端
else if(!s.empty() && s.top() == target[B]) { s.pop(); B++; } //若不满足且栈不为空,则出栈
else if(A <= n) s.push(A++); //若不满足且栈为空,则入栈
else { ok = 0; break; } //若三个都不满足则说明无法重组,ok = 0
}
printf("%s\n", ok ? "Yes" : "No");
}
printf("\n");
}
return 0;
}
心得:刚做这题时感觉有别的做法,就搜了下报告,结果网上基本都是一样的做法,就是改了个变量名= =,面对这种现象,我只想说,玩一两次还是可以的,玩多了就没意思了。。。
回归正题,LRJ大牛的代码还是一如既往的无可挑剔,选择、条件和变量都用的恰到好处,实在佩服。。。
借这道题我也发表下我自己对栈的理解:本来想按照别的做法,因为这无非就是两个有序数列的组合嘛。后来想想不对,第一个不符合的元素永远不可能排在第二、三个不符合元素的前面。然后想用下别的方法限制下,没想出来= =,看来栈就是前人为了解决这样的问题而留给我们的宝贵遗产,这也就是所谓的数据结构!!!刚开始我还不信,试了几组数据才体会到栈的精妙,拿1,2,3,4,5的例子来说,输出5,4,3,2,1、4,5,3,2,1、3,4,5,2,1,只要出栈顺序是可能的,凡是不满足第一个条件的全满足第二个条件,相当于两个数列按照题目所给方式合并,这完全不是凭空能想出来的算法。总之相当于有条件数列合并的简化版,大大简化了我们的算法~
感想虽不多不过还是想写出来,不喜轻喷= =
补充下,LRJ的代码有点问题,想必是想让我们好好看代码吧= =
#include <stack>
using namespace std;
const int MAXN = 1000 + 10;
int n, target[MAXN];
int main()
{
while(~scanf("%d", &n) && n)
{
while(~scanf("%d", &target[1]) && target[1])
{
stack<int> s;
int A = 1, B = 1;
for(int i = 2; i <= n; i++)
scanf("%d", &target[i]);
int ok = 1;
while(B <= n)
{
if(A == target[B]) { A++; B++; } //若满足输入所示要求,则直接到B端
else if(!s.empty() && s.top() == target[B]) { s.pop(); B++; } //若不满足且栈不为空,则出栈
else if(A <= n) s.push(A++); //若不满足且栈为空,则入栈
else { ok = 0; break; } //若三个都不满足则说明无法重组,ok = 0
}
printf("%s\n", ok ? "Yes" : "No");
}
printf("\n");
}
return 0;
}
心得:刚做这题时感觉有别的做法,就搜了下报告,结果网上基本都是一样的做法,就是改了个变量名= =,面对这种现象,我只想说,玩一两次还是可以的,玩多了就没意思了。。。
回归正题,LRJ大牛的代码还是一如既往的无可挑剔,选择、条件和变量都用的恰到好处,实在佩服。。。
借这道题我也发表下我自己对栈的理解:本来想按照别的做法,因为这无非就是两个有序数列的组合嘛。后来想想不对,第一个不符合的元素永远不可能排在第二、三个不符合元素的前面。然后想用下别的方法限制下,没想出来= =,看来栈就是前人为了解决这样的问题而留给我们的宝贵遗产,这也就是所谓的数据结构!!!刚开始我还不信,试了几组数据才体会到栈的精妙,拿1,2,3,4,5的例子来说,输出5,4,3,2,1、4,5,3,2,1、3,4,5,2,1,只要出栈顺序是可能的,凡是不满足第一个条件的全满足第二个条件,相当于两个数列按照题目所给方式合并,这完全不是凭空能想出来的算法。总之相当于有条件数列合并的简化版,大大简化了我们的算法~
感想虽不多不过还是想写出来,不喜轻喷= =
补充下,LRJ的代码有点问题,想必是想让我们好好看代码吧= =
相关文章推荐
- web服务器下出现大量TIME_WAIT
- int main(int argc, char *argv[])中argc和argv的解释
- 如何将Domain Users从Local Administrators Group中清除?
- UVa 10617 Again Palindrome(回文 区间dp)
- 多层嵌套对象无法使用gson反序列化的问题The JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@3bf13cde failed to de
- pat 1079 Total Sales of Supply Chain
- Leetcode Container With Most Water
- django json http://blog.csdn.net/eengel/article/details/6198585...http://www.yihaomen.com/article/python/279.htm
- Could not obtain transaction-synchronized Session for current thread
- 5.7 Pairwise Swap
- Daily Scrum (2015/10/28)
- 栈对于表达式求值的特殊作用&&UVa442 Matrix Chain Multiplication(矩阵链乘)的理解与解析
- NetworkOnMainThreadException
- code dairy
- 【Leetcode】之Container With Most Water
- WebLogic Developer版创建domain
- 常见的Regex表达式(更新RFC标准的email检验)
- AEAI Portal V3.5.2门户集成平台发版说明
- Leetcode || Container With Most Water
- notify()、notifyAll()和wait()