备战蓝桥杯国赛第一天-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;
}
相关推荐
qeen873 分钟前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码14 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler0122 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy11327 分钟前
Linux进程与线程编程详解
linux·c++
minglie129 分钟前
实数列的常用递推模式
算法
代码小书生1 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星1 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新
漂流瓶jz1 小时前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva
leoufung1 小时前
LeetCode 76:Minimum Window Substring 题解与滑动窗口思维详解
算法·leetcode·职场和发展