上周六的天梯赛被L1-8卡到最后,如果我会打比赛的话,如果我在有一点经验的话,队伍的成绩会好很多,因为L2的这两题一个BFS和一个Stack是可以秒的。自己还是不能再比赛中激发更强大的能力,只能说没有做好比赛的准备,输了比赛。
L2-031:先找到入口,然后BFS,注意这里用vector动态存储:
#include <iostream>
#include <string>
#include <queue>
using namespace std;
vector<vector<int> > a;
int main()
{
int n;
cin>>n;
vector<int> in(n+1,0);
a.push_back({});
for(int i=1;i<=n;i++){
vector<int> temp;
int w;
cin>>w;
temp.push_back(w);
for(int j=1;j<=w;j++){
int t;
cin>>t;
in[t]=1;
temp.push_back(t);
}
a.push_back(temp);
}
int getin;
for(int i=1;i<=n;i++){
if(in[i]==0){
getin=i;
break;
}
}
queue<int> q;
q.push(getin);
int ans;
while(!q.empty()){
int n = q.size();
for(int i=0;i<n;i++){
int d = q.front();
q.pop();
ans = d;
for(int j=1;j<=a[d][0];j++){
q.push(a[d][j]);
}
}
}
cout<<ans;
return 0;
}
L2-032:直接用用一个stack水题:
#include <iostream>
#include <string>
#include <queue>
#include <stack>
using namespace std;
int main()
{
int n,m,k;
cin>>n>>m>>k;
while(k--){
vector<int> a(n,0);
stack<int> s;
for(int i=0;i<n;i++){
cin>>a[i];
}
int want=1,f=1;
for(int i=0;i<n;i++){
if(a[i]!=want){
while(!s.empty()){
if(s.top()==want){
s.pop();
want++;
}else{
break;
}
}
if(s.size()==m){
f=0;
cout<<"NO"<<endl;
break;
}
s.push(a[i]);
}else{
want++;
}
}
while(!s.empty()){
if(s.top()==want){
s.pop();
want++;
}else{
break;
}
}
if(s.empty()){
cout<<"YES"<<endl;
}else if(f){
cout<<"NO"<<endl;
}
}
return 0;
}