13 solutions
-
5
这题挺有趣的,思路就是先让A轨的挨个入栈(C),同时进来一节你就告诉轨道管理员该出哪节车厢,轨道管理员先看到进来的不是这节就会等,但也会记住你后面讲的顺序,等管理员看到第一节了,他就先放这节去B,然后检查留在C的最外面那节是不是第二个该出栈的,如果是就让他出去,继续检查下一个,如果不是就算了,等看到了再说。等车厢进完了,管理员再检查最后一次留在栈里的能不能按顺序出去,如果能,管理员知道你没有耍他,就会拍拍你的肩膀说一句YES,如果他发现不能按顺序出完就知道你在耍他,把你暴打一顿,打你的时候你大喊NO!!!!!!
#include<stdio.h> #include<stack> using namespace std; const int N=1e5+7; int b[N];//可以用i来代替A轨,就不用另开 stack <int> s;//C轨 int main(){ int n; scanf("%d",&n); int t=1;//计数器,作用是看出到第几节了 for(int i=1;i<=n;i++){ //i就是A轨 scanf("%d",&b[i]); //告诉管理员按顺序出哪节 while(!s.empty()&&s.top()==b[t]){ //管理员检查留在C的能不能出,如果能,就帮他出个柜 s.pop(); t++; } if(b[t]!=i)s.push(i);//如果不是管理员所期待的那一节,他会把这节狠狠地按进C柜里 if(b[t]==i)t++;//终于等到你,还好我没放弃 } while(!s.empty()){ //最后帮尔等出个柜,希望不要不识好歹 if(s.top()==b[t]){ t++; s.pop(); } else break; } if(s.empty())printf("That's ♂ good!");//来自管理的夸奖(doge) else printf("NO!!!!!!");//来自管理的爱抚(doge) return 0; }
-
2
这题 真的很好,我被 题目 的意思 给卡住了。读了半天 都没太理解什么意思。看了下 其他人的 题解,发现 原来 C 站 是要 先进后出好像。那就简单多了,无非就是 在 A 轨道 选择一下数,看下 有没有,如果没有对应上的,那就 去 看看 C 站 里 有没有,如果 俩者 都不行,那算了,那就把这个数字 放到 C 站立就行了。
依次 选择数字下去,如果 能够 凑出 给定的顺序 就是 YES,如果凑不出,那就是 NO。
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stack> using namespace std; const int N = 1e5 + 7; int B[N];// 我们给的顺序 也是 最后 B 轨道 应该的顺序 int main(void) { // 从 A 方向 来的火车 进入 C 车站之前 都不是 连接着的。 // 这些火车 可以 自行 移动到 B 处 的 铁轨 // C 车站 可以 随意 停放 多节车厢 // 进入到了 C 车站后,就不能 再回到 A 方向的铁轨 // 进入了 B 方向 铁轨 也不能再回到 车站 C // 从 C 车站到 B 的,必须 按照 先进后出的 顺序 !!! //最终目的 是 使其 a1 a2 a3 的顺序 从 B 方向驶出。这个 顺序 是我们指定的 int n; cin >> n; for (int i = 0; i < n; ++i) { cin >> B[i]; } int sub = 0;// stack<int> s; // 先从 A 轨道 选 车厢 for (int i = 1; i <= n; ++i) { while (!s.empty() && s.top() == B[sub]) {// 可能 C 车站里 有车厢 可以选 sub++; s.pop(); } if (i == B[sub]) {// 则 满足 条件, sub++;// 证明 从 A 直接 到 B 就行,然后 下一个 位置的 数字需要 进行判断 } else { s.push(i);// 不能选的话,那就放到 C 车站里 } } bool flag = true;// 默认是可以 实现目的的 while (!s.empty()) { if (s.top() != B[sub]) { flag = false; break; } else { s.pop(); sub++; } } if (flag) { cout << "YES" << endl; } else { cout << "NO" << endl; } return 0; }
代码 可能 跟 第一位 大佬的题解差不多,但是 根据思路来说,确实 也不会写的 相差多少。反而 是接近一样才对。
-
2
感觉我代码挺好理解的,不知道有没有bug
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; stack <int> s; int flag=0; int k[1007];//开个数组读入需要的序列 for(int i=0;i<n;i++) { scanf("%d",&k[i]); } for(int i=1;i<=n;i++) { while(!s.empty()&&s.top()==k[flag]) { s.pop(); flag++; } s.push(i); }//中途可以先出车站的就先出去,不能不出的就存下来 if(!s.empty()) { for(int j=flag;j<n;j++)//flag可以记录从车站出去的火车到第几辆了 { if(k[j]==s.top()) s.pop(); else { break; } } }//继续匹配车站中剩下的 s.empty()?cout<<"YES":cout<<"NO";//判断 return 0; }
-
1
看懂题意就简单了,以下是不正规写法; 当输入的数为n时,只要保证后面的数顺序减小便成立;
#include<bits/stdc++.h> using namespace std; int main() { int a[1005]; int n,t,count=1,temp=0,flag=0; cin>>n; for(int i=0;i<n;i++){ cin>>t; if(temp==1){ a[count]=t; count++; } if(t==n) temp=1; } if(count>1){ for(int i=0;i<count-1;i++){ if(a[i]<a[i+1]){ flag=1; break; } } } if(flag==1) cout<<"NO"; else if(flag==0||count==1) cout<<"YES"; return 0; }
-
1
#include<bits/stdc++.h> using namespace std; stack<int> pp;//a栈 stack<int> dd;//b栈 int n,i[1005]; int main() { cin>>n; for(int c=0;c<n;c++){ cin>>i[c]; pp.push(n-c);//按顺序将对应车厢压入a栈中 } for(int c=0;c<=n;c++){ if(c==n){ cout<<"YES"; return 0; } else if(dd.empty()){ while(pp.top()<=i[c]){ dd.push(pp.top()); pp.pop(); if(pp.empty()) break; } dd.pop();//while循环后对于c站栈顶的车厢号就是我们所需要车厢号 }else{ if(i[c]>dd.top()){ if(pp.empty()){ cout<<"NO"; //c站栈顶车厢号不为所需车厢号且a站中已无车厢 return 0; } if(pp.top()>i[c]){//a站中无所需车厢 cout<<"NO"; return 0; }else{ while(pp.top()<=i[c]){//a站中存在有当前所需的车厢号 dd.push(pp.top()); pp.pop(); if(pp.empty()) break; } dd.pop();//while循环后对于c站栈顶的车厢号就是我们所需要车厢号 } }else{ if(i[c]==dd.top())dd.pop(); else{ cout<<"NO"; return 0; } } } } }
若某栈已为空 再进行top()操作会出现sgmentation fault 的错误
-
1
用一个栈来充当C,用一个数组来充当A,先将需要的顺序进行存储,接着从第一个存储的数开始从未入栈的数列里开始查找,如果等于当前查找的数,或着等于栈顶的数就进行下一次查找,否则就将当前的数压入栈中,如果找不到当前要查找的数就break。注意的是这里的查找是一次性的,意思是会接着上一次查找的位置继续查找,因为那些不匹配的数已经压入栈中了。最后只需要判断是否查找完,没有查找完就是NO,否则是YES。
#include <bits/stdc++.h> using namespace std; int w[1007]; stack<int>s; int main(){ int n,opt=1,ss=0;//个数,查找的位置,当前查找的数 cin>>n; for(int i=1;i<=n;i++){ cin>>w[i]; } s.push(-1);//先存储一个数,避免当s为空时出问题 for(ss=1;ss<=n;ss++){//当前查找的数 int k=w[ss]; int flag=0; if(s.top()==k) flag=1,s.pop();//是否在栈顶 else{//是否在未入栈的数列里面 for(;opt<=n;opt++){ if(k==opt){//找到就退出 opt++,flag=1;break; }//不是当前要找的数就压入栈中 else s.push(opt); } } if(flag==0) break;//判断是否找到 } if(ss==n+1) cout<<"YES"; else cout<<"NO"; return 0; }
-
0
不才,斗胆发一下自己的写法....可能很菜0.0
#include<bits/stdc++.h> #define MAX 1000 using namespace std; int B[MAX]; int main(){ stack<int> c; int n; cin>>n; for(int i=1;i<=n;i++){ cin>>B[i]; } int j=1; int i=1; do{ if(c.empty()==0){ if(c.top()==B[j]){ c.pop(); j++; continue; } } if(i<=n){ c.push(i); i++; continue; } if(!c.empty()&&i>n){ cout<<"NO"<<endl; break; } }while(j<=n); if(j>n) cout<<"YES"<<endl; return 0; }
-
0
直接利用一个规则 i<j<k a[i]>a[k]>a[j]; 代码 #include #include <math.h> using namespace std; int a[1005]; int main() { int m;cin>>m; for(int i=1;i<=m;++i) { cin>>a[i]; }
for(int i=1;i<=m;++i) { for(int j=i+1;j<=m;++j) if(a[i]>a[j]) { for(int k=j+1;k<=m;k++) { if(a[i]>a[k]&&a[j]<a[k]) { cout<<"NO"; return 0; } } } } cout<<"YES"; return 0;
}
-
0
用栈模拟就完了
不过这个题目我真的是费了好大力气才读懂,感觉实在是.....
我这个代码有些复杂,其实有很多可以简化,
我太懒了就没去搞,有兴趣的可以弄一下
#include<bits/stdc++.h> using namespace std; int n,num[1005],ans[1005],cnt; int main() { std::ios::sync_with_stdio(false); cin>>n; stack<int> st; for(int i=1;i<=n;i++) cin>>num[i]; if(num[1]==1) ans[1]=1; for(int i=1,j=1;i<=n;i++) { if(num[i]>=i)//如果指定车厢比目前的数字大 { for(;j<=num[i];j++)//j要从1开始变 st.push(j); if(st.top()==num[i]){ st.pop();//出一个栈顶的元素 ans[i]=num[i]; } else{ cout<<"NO"; break; } } if(num[i]<i)//如果指定车厢比目前的数字小 { if(st.empty())//如果栈为空就直接no { cout<<"NO"; break; } if(st.top()==num[i])//如果栈顶是该数字 { ans[i]=num[i]; st.pop();//出栈 } else{ cout<<"NO"; break; } } } for(int i=1;i<=n;i++) { if(ans[i]==num[i]) cnt++; } if(cnt==n) cout<<"YES"; return 0; }
-
0
#include<bits/stdc++.h> using namespace std; stack <int> s; int pos[1000000]; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>pos[i]; } int i=0; for(int j=1;j<=n;j++){ s.push(j); if(pos[i]==s.top()){ while(!s.empty()){ if(pos[i]==s.top()){ s.pop(); i++; } else{ break; } } } } if(!s.empty()){ cout<<"NO"; } else{ cout<<"YES"; } return 0; }
-
0
借鉴了大佬的代码= =,我是蒟蒻 难点在理解题意。 主要思路就是判断是否—————栈中的数比输入的数小
#include<bits/stdc++.h> using namespace std; int n,fg,k,countt; int a[1015]; stack<int> s; int main() { cin>>n; for(int i=1;i<=n;++i) { cin>>a[i]; } countt=1;//记录有多少数进栈 for(int i=1;i<=n;++i) { k=a[i]; while(countt<=k)//小于a[i]的数必须在栈中 (难点) { s.push(countt);//依次进栈 countt++; } if(s.top()!=a[i])// 大数,一定可以出栈 { // 小于k的数, 必须从大到小依次出栈, 否则就不符合 cout<<"NO"; return 0; } s.pop();//符合要求a[i]就出栈 到B } cout<<"YES"; return 0; }
-
0
#include<stdio.h> #include<stack> #include <vector> #include<iostream> #include<string.h> using namespace std; int main() { int num; int s1[100]; int s2[100]; scanf("%d",&num); stack<int> train; vector<int> member; int j = 0; for(int i = 0;i<num;i++){ scanf("%d",&s2[i]); } for(int i = 0;i<num;i++){ s1[i] = (i+1); } for(int k = 0;k < num;k++) { train.push(s1[k]); member.push_back(1); while(!train.empty()&&train.top() == s2[j]) { member.push_back(0); train.pop(); j++; } } if(train.size()==0){ printf("YES\n"); } else { printf("NO\n"); } memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); return 0; }
-
0
写的有点复杂,开了三个栈
#include<bits/stdc++.h> using namespace std; stack <int> a; stack <int> b; stack <int> c; int main(){ int n,en[1005],be[1005]; cin>>n; for(int i=1;i<=n;i++){ be[i]=i;//将开始的火车存入be数组 } for(int i=1;i<=n;i++){ cin>>en[i]; a.push(en[i]);//将最终的火车压入栈a } int j=1;//查找开始火车,一节一节查找 for(int i=1;i<=n;i++){ if(en[j]==be[i]){//相等直接压入 b.push(be[i]); j++; } else if(!c.empty()&&en[j]==c.top()){//查找是否与c站压顶相等 b.push(c.top()); //一定要判断c栈为空,害我改了一小时,我是fw c.pop(); j++; i--; } else{ c.push(be[i]); } } while(!c.empty()){//将c栈中的数压入b栈 b.push(c.top()); c.pop(); } if(a==b) cout<<"YES";//判断 else cout<<"NO"; return 0; }
- 1
Information
- ID
- 291
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 6
- Tags
- # Submissions
- 139
- Accepted
- 44
- Uploaded By