备战蓝桥杯国赛第一天-atcoder-beginner-contest404
B.
因为只有四种情况,旋转90/180/270度后替换,直接替换,暴力即可
C.
循环图的定义是每个点出度为2,而且只有一个环的,所以先判断出度,再判断是否成环
#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,所以问题不大
#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&°ree[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&°ree[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就可以了,记得最后一个点不一定有豆子,所以直接遍历找最后一个豆子
#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;
}