备战蓝桥杯国赛第一天-atcoder-beginner-contest404

B.

因为只有四种情况,旋转90/180/270度后替换,直接替换,暴力即可

C.

循环图的定义是每个点出度为2,而且只有一个环的,所以先判断出度,再判断是否成环

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,cnt;
int degree[200010];
vector<vector<int>> a;
bool vis[200010];
bool flag;

void dfs(int x){
	cnt++;
	vis[x]=1;
	for(int u:a[x]){
		if(!vis[u]){
			dfs(u);
		}
	}
}

int main()
{
  cin>>n>>m;
  a.resize(n + 1);
  for(int i=0;i<m;i++){
    cin>>x>>y;
  	a[x].push_back(y);
  	a[y].push_back(x);
  	degree[x]++;
  	degree[y]++;
  } 
  for(int i=1;i<=n;i++){
  	if(degree[i]!=2){
  		cout<<"No"<<endl;
  		return 0;
	  }
  }
  dfs(1);
  if(cnt==n) cout<<"Yes"<<endl;
  else cout<<"No"<<endl; 
  return 0;
}

D.

暴力做法,对于每一个动物园有三种状态,看0/1/2次,所以用dfs枚举三种状态,复杂度是3的n次方,n<=10,所以问题不大

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y;
long long mins;
int a[15],degree[15],aa[110];
vector<vector<int>> b;

void dfs(int x){
	if(x==n+1){
		for(int i=1;i<=m;i++) aa[i]=0;//重置计数数组 
		for(int i=1;i<=n;i++){
			for(int j=0;j<degree[i];j++){
				for(int u:b[i]) aa[u]++;
			}
		}
//		for(int i=1;i<=n;i++) cout<<degree[i]<<" ";cout<<endl;
//        if(degree[3]==2&&degree[4]==2){
//        	for(int i=1;i<=n;i++) cout<<degree[i]<<" ";cout<<endl;
//        	for(int i=1;i<=m;i++) cout<<aa[i]<<" ";cout<<endl;
//		}
		for(int i=1;i<=m;i++){
			if(aa[i]<2) return;
		}
//		if(degree[3]==2&&degree[4]==2){
//        	for(int i=1;i<=n;i++) cout<<degree[i]<<" ";cout<<endl;
//        	for(int i=1;i<=m;i++) cout<<aa[i]<<" ";cout<<endl;
//		} 
		long long sum=0;
		for(int i=1;i<=n;i++){
			sum+=a[i]*degree[i];
		}
//		cout<<sum<<endl;
//		for(int i=1;i<=n;i++) cout<<degree[i]<<" ";cout<<endl;
		mins=min(mins,sum);
		return;
	}
	
	for(int i=0;i<3;i++){
		degree[x]=i;
		dfs(x+1);
		degree[x]=0;
	}
}

int main()
{
	cin>>n>>m;
	b.resize(n+1);
	mins=1e18;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>x;
		for(int j=0;j<x;j++) cin>>y,b[y].push_back(i);
	}
	dfs(1);
	cout<<mins<<endl;
	return 0;
}

E.

最核心的事情就是让最后一个豆子在回到起点的同时,路过所有有豆子的地方

所以我们就可以按照我们的想法建单向边,对于有豆子的地方可以分配的前c[i]范围内都没豆子的话都建边,如果有豆子的话就找最近的豆子建边,这样可以保证路过所有有豆子的地方,最后跑一个最短路算法dijkstra就可以了,记得最后一个点不一定有豆子,所以直接遍历找最后一个豆子

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int n,flag,c[2010],a[2010],dist[2010],vis[2010];
vector<vector<int>> adj;

void dijkstra(){
	priority_queue<PII> heap;
	heap.push({0,0});
	while(heap.size()){
		int u=heap.top().first;
		heap.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(auto v:adj[u]){
			if(dist[v]>dist[u]+1){
				dist[v]=dist[u]+1;
				heap.push({v,-dist[v]});
			}
		}
	}
}

int main()
{
	cin>>n; 
	adj.resize(n+1);
	for(int i=1;i<n;i++) cin>>c[i];
	for(int i=1;i<n;i++) cin>>a[i];
	for(int i=1;i<n;i++){
		flag=0;
		for(int j=1;j<=c[i];j++){
			if(a[i-j]){
				flag=1;
				adj[i-j].push_back(i);
				break;
			}
		}
		if(!flag){
			for(int j=1;j<=c[i];j++){
				adj[i-j].push_back(i);
			}
		}
	}
	memset(dist,0x3f,sizeof dist);
	dist[0]=0;
	dijkstra();
	int maxs=0;
	for(int i=1;i<n;i++){
		if(a[i]) maxs=max(maxs,dist[i]);
	}
	cout<<maxs<<endl;
	return 0;
}
相关推荐
?!7146 分钟前
数据结构之哈夫曼树
c语言·数据结构·c++·算法
xiaoli232714 分钟前
机器学习朴素贝叶斯算法
人工智能·算法·机器学习
xin007hoyo18 分钟前
算法笔记.约数个数
数据结构·笔记·算法
yy鹈鹕灌顶21 分钟前
十大排序算法全面解析(Java实现)及优化策略
java·算法·排序算法
CodeWithMe23 分钟前
【中间件】brpc_基础_butex.h
c++·中间件·rpc
sunshineine23 分钟前
Linux系统安装PaddleDetection
linux·运维·服务器·人工智能·算法
n33(NK)25 分钟前
【算法基础】三指针排序算法 - JAVA
java·算法·排序算法
.格子衫.1 小时前
014枚举之指针尺取——算法备赛
java·c++·算法
明月看潮生1 小时前
青少年编程与数学 02-018 C++数据结构与算法 24课题、密码学算法
c++·算法·青少年编程·密码学·编程与数学
小小白?1 小时前
64.搜索二维矩阵
数据结构·线性代数·算法·矩阵