E题
主要思路:这很明显是一道无权无向可能有环图,既然是无权图那用其他算法就过于冗余,在这里我用的是BFS广搜。这道题搜索非常简单,层搜是一定可以找到最短路径的,在这里设置vis的目的是记录走过的节点(为什么走过的节点不能再走呢?因为如果一个节点重复两次的路径一定不会是最短路径了!!)相当于一个树上的bfs,难点是记录路径后输出。可以设置一个pre数组来存路径。重点!!可以反向从y搜x,这样在输出pre数组的时候不用调整顺序,最后设置一个while循环输出即可。(本蒟蒻在做题的时候用for循环输出然后一直re了,可能是对for循环理解还不够透彻)
代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
queue <int> q;
const int N=2e5+10;
vector<int> g[N];
bool vis[N];
int pre[N];
int x,y;
void bfs(int y){//bfs搜索
q.push(y);
while(q.size()){
int b=q.front();
q.pop();
for(auto &i:g[b]){
if(vis[i]) continue;
vis[i]=1;
q.push(i);
pre[i]=b;
if(i==x) return;
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;cin>>n>>x>>y;
for(int i=0;i<n-1;i++){
int a,b;cin>>a>>b;
g[a].push_back(b);//存图
g[b].push_back(a);
}
bfs(y);//搜!暴搜!
while(true){//输出路径
cout<<x<<' ';
if(x==y) break;
x=pre[x];
}
return 0;
}
B题
思路:按照贪心的想法可以先考虑把原数组排序,然后从大到小把所有数按顺序都放在偶数的位置,然后再把剩下的数按同样从大到小顺序放在奇数位置(较大的数附近也是较大的数)为了减少时间复杂度,在放奇数的时候我们可以边放边判断,如果不符合就break。这道题有个重点就是1的特判定,因为在判断数组偶数和奇数位大小的时候很有可能用到-1或+1,如果数组只有一个元素容易越界!(WA三个的原因)
代码
#include<iostream>//比赛很紧张,代码可能冗余,参考即可
#include<algorithm>
using namespace std;
const int N=2e5+10;
int a[N];
int b[N];
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
for(int i=0;i<t;i++){
cin>>a[i]; //其实建议scanf,读入大量数据有优势
}
if(t==1){cout<<"Yes";return 0;}
sort(a,a+t);
int k=t-1;
for(int i=1;i<t;i+=2){
b[i]=a[k--];
}
for(int i=0;i<t;i+=2){
b[i]=a[k--];
if(i==0&&b[i]<b[i+1])continue;//有点愚蠢的边界判定,但是比赛时候想不起来OvO
else if(b[i]<b[i+1]&&b[i]<b[i-1])continue;
else if(i==t-1&&b[i]<b[i-1]) continue;
else{
cout<<"No";
return 0;
}
}
cout<<"Yes";
return 0;
}
这里的代码都是AC过评测的,但是不一定没有错误,如果有问题可以帮我指出,本人蒟蒻,代码比较冗余,现在正在改进。仅作为自己的学习记录和思路梳理,希望能慢慢进步吧