ICPC North Central NA Contest 2017
https://www.jisuanke.com/contest/7331?view=challenges
G. Sheba's Amoebas
题意:给定一个图,求图里有几个封闭图形
思路:用DFS每次将一整块连通图标记,最后看标记了多少个
直接上代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef pair<ll,ll> PAIR; const int maxn = 110; int n,m,ans; char mp[maxn][maxn]; bool vis[maxn][maxn]; int dir[8][2]={1,0,1,1,0,1,-1,1,-1,0,-1,-1,0,-1,1,-1}; bool check(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m&&vis[x][y]==0&&mp[x][y]=='#') return true; else return false; } void dfs(int x,int y) { vis[x][y] = true; for(int i=0;i<8;i++) { int tx = x+dir[i][0]; int ty = y+dir[i][1]; if(check(tx,ty)) dfs(tx,ty); } } int main() { cin>>n>>m; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>mp[i][j]; } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(mp[i][j]=='#'&&vis[i][j]==0) { dfs(i,j); ans++; } } } cout<<ans<<endl; return 0; }
H. Zebras and Ocelots
题意:动物园有斑马和猎豹,他们自上向下排列,敲一次钟,最下面的猎豹就会变成斑马,并且该猎豹下面的斑马也会变成列表,问钟敲几次之后,就会全部变成斑马。
思路:找规律 发现猎豹所在层数和需要敲钟次数有一定关系 2的n-1次方
次数0 1 2 3 4
Z O O O O
O Z Z O O
O Z O Z O
所有从下向上遍历,遇到猎豹加上相应次数即可
AC代码:
#include<iostream> #include<string> #include<cstring> #include<bits/stdc++.h> using namespace std; int main() { long long node[100];// 存2的n次方 int n; scanf("%d",&n); //构造 2 的n次方 node[1] = 1; for(int i=2;i<=n;i++) { node[i] = 2*node[i-1]; } long long ans = 0;//答案 char x [100]; for(int i=1;i<=n;i++) { cin>>x[i]; } for(int i=n;i>=1;i--) // 从下向上遍历 { if(x[i]=='O') { ans += node[n-i+1]; // 如果有O 则 相加 } } cout<<ans<<endl; return 0; }
I. Racing Around the Alphabet
题意:一个圆盘上有28个字符,给定一串文字,问一次走完需要多长时间,给定速度和长度
思路:其实这道题要求走的距离,圆盘周长可求,一周28个字符,所有求出他一共走过了几个字符即可 他会站在开头字符处,去下一个字符时有两种方式,逆时针或者顺时针,哪个方法走过的字符少就用哪个方法
AC代码:
#include<iostream> #include<string> #include<cstring> #include<bits/stdc++.h> using namespace std; const double pi = 3.1415926535; int main() { int t; cin>>t; getchar(); while(t--) { int ans = 0; string s; getline(cin,s); for(int i=1;i<s.length();i++) { int a = s[i-1]-'A'+1; int b = s[i] - 'A'+1; if(s[i-1]==' ') {a = 27;} else if (s[i-1]=='\'') a = 28; if(s[i]==' ') b = 27; else if(s[i]=='\'') b = 28; if(b<a) { int z = b; b = a; a = z; } int x1 = b-a; int x2 = 28-(b-a); ans+=min(x1,x2); } double zc = pi*60; double jd = 1.0*zc/28*ans; double sum = 1.0*jd/15+s.length(); printf("%.10f\n",sum); } return 0; }
J. Lost Map
各村庄之间建路,求最小成本,最小生成树
AC代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e7 + 100; const int maxm = 4e3 + 100; struct bian//存储边的信息 { int x,y,w; }a[maxn]; int father[maxm];//每个点的最终父类 int n,m=1; bool cmp(const bian& a,const bian& b) { return a.w<b.w; } int getfather(int x)//递归找父类 { if(father[x]==x) return x; father[x] = getfather(father[x]); return father[x]; } void unionm(int x,int y)//合并 { int fa,fb; fa = getfather(x); fb = getfather(y); if(fa!=fb) father[fa] = fb; } void Init()//父类初始化 { for(int i = 1;i <= n;i++) father[i] = i; return; }; void Kruskal() { int ans = 0; int k = 0; for(int i=1;i<=m;i++) { if(getfather(a[i].x)!=getfather(a[i].y)) { unionm(a[i].x,a[i].y); ans+=a[i].w; k++; cout<<a[i].x<<" "<<a[i].y<<endl; } if(k==n-1) break; } // if(k==n-1) cout<<ans<<endl; // else cout<<"impossible"<<endl; } int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int w; cin>>w; if(i<j) a[m++]={i,j,w}; } } m--; Init(); sort(a+1,a+1+m,cmp); Kruskal(); return 0; }