SCUT ACM女生赛补题

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过评测的,但是不一定没有错误,如果有问题可以帮我指出,本人蒟蒻,代码比较冗余,现在正在改进。仅作为自己的学习记录和思路梳理,希望能慢慢进步吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值