UVA - 514:Rails

题目链接:https://vjudge.net/problem/UVA-514

题目分析

题目的意思是给一个栈输入一系列数据,在这个过程中可以出栈,看能否达到某个结果。
刚开始我觉得这个情况好多,因此不是用模拟,而应该观察结果本身。对于结果中某个元素x,比他小的元素肯定已经入过栈了,此时可能有两种去处:

  1. 已经在结果里面了
  2. 还在栈里面

对于1.,只能说它比x 小而且在x的前面,除此之外没有其他约束了。
对于2.,那些比x小的元素在结果中的位置肯定在x的后面,而且肯定是逆序排列。因为只能进栈一次,而他们是从小到大进栈的,必然是从大到小出栈的。如果不符合这个条件肯定就是非法情况。
我的思路就是检查每个元素后面比他小的元素是否是逆序的,复杂度是O(n2)O(n^2)O(n2)
UVa里面有时候要求最后有换行,有时候又要求不能有空行,真是让人摸不着头脑。。

AC代码

#include <iostream>
#include <vector>
#include <deque>using namespace std;int n;
vector<int> arr;bool check_idx(int idx) {int x = arr[idx];int minx = x;for (int i = idx + 1; i < n; ++i) {if (arr[i] < x) {if (arr[i] > minx) return false;minx = arr[i];}}return true;
}bool check() {for (int i = 0; i < n; ++i) {if (!check_idx(i)) return false;}return true;
}bool first = true;int main() {ios::sync_with_stdio(false);while (cin >> n && n != 0) {
//        if (first) first = false;
//        else cout << "\n";arr.resize(n);while (cin >> arr[0] && arr[0] != 0) {for (int i = 1; i < n; ++i) cin >> arr[i];if (check()) cout << "Yes\n";else cout << "No\n";}cout << "\n";}return 0;
}

半年后再来写这道题,还是想到了这种方法,虽然想到了一个优化,但是最坏的复杂度仍然是O(n^2)的。而且没有用函数封装,导致代码丑了一些。
和上次一样在换行这里卡了,UVa真恶心,还卡换行。

//
// Created by Administrator on 2022/4/20.
//#include <iostream>
#include <vector>/** 当x进入B的时候,C中都是比x小的元素,A中都是比x大的元素。* 因为进入C的元素越来越大,所以比x小的还未出现的元素肯定在C里面的,而且是以倒序出现在x的后面。* 因此对于出站的每一个x,判断后面比x小的元素是不是逆序的。如果是则为真,以后访问到就不用再判断了,如果出现一个假就不可能了*/using namespace std;template<typename T>
void print(const vector<T> &arr) {for (auto &x : arr) cout << x << " ";cout << "\n";
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, t;vector<int> arr;vector<bool> illegal;bool fail;while (cin >> n && n) {arr.resize(n);illegal.resize(n, false);while (cin >> t && t) {for (int i = 0; i < n; ++i) illegal[i] = false;arr.clear();arr.push_back(t);for (int i = 1; i < n; ++i) {cin >> t;arr.push_back(t);}//print(arr);fail = false;for (int i = 0; i < n; ++i) {if (illegal[i]) continue;t = arr[i];illegal[i] = true;for (int j = i + 1; j < n; ++j) {if (arr[j] < arr[i]) {if (arr[j] < t) {illegal[j] = true;t = arr[j];} else {fail = true;break;}}}if (fail) break;}if (fail)  cout << "No\n";else cout << "Yes\n";}cout << "\n";}return 0;
}

更好的思路

看了一下书上了代码(书上的代码真的丑,写出这么晦涩的代码也是很厉害的),发现是可以进行模拟的,而且复杂度是O(n)O(n)O(n),如果题目有心刁难我上面的解法可能就会TLE。
模拟的思路就是,刚开始肯定是按照从小到大的元素进栈,如果我们结果中当前元素直接是这个入栈的元素,那么再直接出栈,否则就丢在栈里。如果不是当前入栈元素,那么就和栈顶的元素比较,如果也不是,那就先入栈,看看后面的元素还有没有希望,如果所有元素都已经入栈了,那就没希望了,直接GG。

AC代码

#include <iostream>
#include <vector>
#include <deque>using namespace std;int n;
deque<int> s;
vector<int> arr;bool check() {int x = 1;for (int i = 0; i < n; ++i) {if (arr[i] == x) {++x;continue;}if (!s.empty()) {if (s.back() == arr[i]) {s.pop_back();continue;} else if (s.back() > arr[i]) {return false;}}
//        if (x > arr[i]) return false;if (x < n) {s.push_back(x++);--i;} else {return false;}}return true;
}int main() {ios::sync_with_stdio(false);while (cin >> n && n != 0) {arr.resize(n);while (cin >> arr[0] && arr[0] != 0) {s.clear();for (int i = 1; i < n; ++i) cin >> arr[i];if (check()) cout << "Yes\n";else cout << "No\n";}cout << "\n";}
}

感觉这道题的数据很弱,我刚才把s.clear()写到循环外面去了都AC了。。
添加了一个优化语句:当栈顶元素比结果中的当前元素大时直接不可达,原因是后面的元素肯定都比栈顶元素大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVA - 442:Matrix Chain Multiplication

题目链接&#xff1a;https://vjudge.net/problem/UVA-442 题目分析 题目的意思非常简单&#xff0c;就是给定一个矩阵乘法的表达式然后计算就可以了。随便写写 AC代码 #include <iostream> #include <deque> #include <vector> #include <string>…

leetcode869. 重新排序得到 2 的幂

题目连接&#xff1a;https://leetcode-cn.com/problems/reordered-power-of-2/ 题目分析 如果直接顺着题目的思路&#xff0c;得到数字n的全排列&#xff0c;然后再去判断其是不是2的幂是比较复杂的。 我们应该注意到&#xff0c;因为数字是可以随意排列的&#xff0c;因此所…

使用wireshark+ssh+tcpdump远程抓包

因为需要抓取远程服务器上的数据包&#xff0c;又不想使用tcpdump这种命令行工具进行&#xff08;用了wireshark后谁还愿意去看密密麻麻的命令行呢&#xff09;&#xff0c;所以在网上查找了一下使用wireshark远程抓包的方法&#xff0c;在这里记录一下。 原生支持 wireshark…

C++ Variadic Templates(可变参数模板)

本文参考侯捷老师的视频&#xff1a;https://www.youtube.com/watch?vTJIb9TGfDIw&listPL-X74YXt4LVYo_bk-jHMV5T3LHRYRbZoH 以及C primer第五版 相关内容。 可变参数模板函数 //递归的终止条件 void print() {} //Variadic Templates //一般用于递归处理 template <…

Ubuntu修复Fix Busybox Initramfs错误

今天早上我打开电脑&#xff0c;进入Ubuntu系统&#xff0c;结果黑屏了&#xff0c;屏幕显示&#xff1a; BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.1) built-in shell (ash) Enter help for a list of built-in commands.(initramfs)然而我并不知道这个是什么意思&#x…

Leetcode第284场周赛

绪论 最近发现Leetcode每周的周赛难度挺适合我的&#xff0c;而且时间也比较友好&#xff08;不像Codeforces每次都是半夜&#xff09;。所以连续参加了三周的周赛。这次才想起来应该记录一下自己的参赛历程。一方面是总结经验&#xff0c;另一方面有了记录就更有动力去提升&a…

Leetcode第286场周赛

绪论 上周因为有事没有参加周赛&#xff0c;这周没有错过。这次周赛拿到了人生第一个AK&#xff0c;参加大大小小的比赛这么多次&#xff0c;从来没有AK过&#xff0c;泪目了。 感觉这次比赛的思维难度对我来讲稍高一些&#xff0c;前三道题就花了一个小时&#xff0c;而以往…

第287场周赛

绪论 虽然是上周日参加的比赛&#xff0c;但是这周没有怎么学习&#xff0c;每天就是玩耍。也导致对周赛的总结迟迟没有进行。想着再拖下去下次周赛都要开始了&#xff0c;在这里补一下。 这场比赛总体比上场简单一些&#xff0c;但是最后一道题因为忘记初始化类内变量导致调试…

第288场周赛

绪论 虽然没有AK&#xff0c;但是不知道为什么排名比以前AK了都靠前。可能是因为最后一道题有些难度&#xff0c;缩小了我和大佬之间的差距。最后一个小时写最后一道题&#xff0c;累死累活想了一个贪心遍历的算法&#xff0c;当时是一直RE&#xff0c;后来下来调了调又WA了。 …

Clion远程部署和运行

绪论 作为Clion的忠实粉丝&#xff0c;现在的我的几乎所有的coding都是通过Clion完成。因为需要在服务器上进行开发&#xff0c;又离不开Clion&#xff0c;就了解了如何通过Clion远程部署和开发。 主要是借鉴了博客&#xff1a;使用Clion优雅的完全远程自动同步和远程调试c。如…

C++ 单例模式 call_once : terminate called after throwing an instance of ‘std::system_error‘

在学习了C中可以使用call_once进行初始化资源后&#xff0c;我就想着写一个单例模板供以后使用。 template<typename T> class SingleTon {using Ptr std::shared_ptr<T>;static Ptr p;static std::once_flag flag;template<typename ...Args>static void …

C++读写锁造成死锁

C14支持std::shared_timed_mutex C17支持std::shared_mutex 前者相比后者支持的操作更多&#xff0c;但是后者相对性能更好。 使用std::lock_guard<std::shared_mutex>和std::unique_lock<std::shared_mutex>互斥访问使用std::shared_lock<std::shared_mutex…

每日一题:449. 序列化和反序列化二叉搜索树

题目分析 题目链接&#xff1a;449. 序列化和反序列化二叉搜索树 觉得序列化很简单&#xff0c;前序遍历、后序遍历、中序遍历、层序遍历等等。其中得到前序遍历和后序遍历是可以通过递归解法反序列化的&#xff0c;觉得这样子做有点复杂。就想着可不可以一次遍历。一次遍历的…

C++高效集合数据结构设计

绪论 在复杂算法实现过程中我们经常会需要一个高效的集合数据结构&#xff0c;支持常数级别的增、删、查&#xff0c;以及随机返回、遍历&#xff0c;最好还能够支持交集、并集、子集操作 哈希集合实现 大家可能很快想到unordered_set&#xff0c;unordered_set由于底层是哈…

C++ 工具函数库

在写一些大型项目的过程中经常需要一些工具函数&#xff0c;例如获取随机数、计时器、打印函数、重要常量&#xff08;如最大值&#xff09;、信号与槽等&#xff0c;由于每一个工程都自己手动实现一个实在是太傻&#xff0c;我将其总结放入一个文件中。 utils.h // Copyright…

muduo网络库使用入门

muduo网络库介绍 muduo网络库是陈硕大神开发的基于主从Reactor模式的&#xff0c;事件驱动的高性能网络库。 网络编程中有很多是事务性的工作&#xff0c;使用muduo网络库&#xff0c;用户只需要填上关键的业务逻辑代码&#xff0c;并将回调注册到框架中&#xff0c;就可以实…

C++ map/unordered_map元素类型std::pair<const key_type, mapped_type>陷阱

在开发的过程中需要遍历一个unordered_map然后把他的迭代器传给另一个对象&#xff1a; class A; class B { public:void deal(const std::pair<int, A>& item); }; std::unordered_map<int, A> mp; B b; for (auto &pr : mp) {b.deal(pr); }在我的项目中…

Ubuntu install ‘Bash to dock‘

绪论 在Ubuntu环境搭建这篇博客中记录了使用Dash To Dock来配置Ubuntu的菜单项&#xff0c;使得实现macOS一样的效果。为了配置新电脑的环境&#xff0c;我还是想安装这个软件。但是如今在Ubuntu Software中已经找不到这个软件了&#xff0c;我在网上借鉴了一些博客的经验才得…

Leetcode第309场周赛

Date: September 4, 2022 Difficulty: medium Rate by others: ⭐⭐⭐⭐ Time consuming: 1h30min 题目链接 竞赛 - 力扣 (LeetCode) 题目解析 2399. 检查相同字母间的距离 class Solution {public:bool checkDistances(string s, vector<int>& distance) {vec…

C++ 模板函数、模板类:如果没有被使用就不会被实例化

C中如果一个模板函数没有使用过&#xff0c;那么其局部静态变量都不会被实例化&#xff1a; class A { public:A() {edward::print("A ctor");} };template<typename T> void test() {static A a; }int main() {test<int>(); //如果注释掉则不会有输出r…