SICNU 2018 Summer Training #10
这次比赛题挺难的,1个多小时把签到的几题做了之后就动不了手了,就很难受
首先是C题字符串操作,比赛刚开始就很多人过,而且是一遍过,感觉应该挺简单的,但是读题读了好久,真的好久。。
思路就是按照他给的操作模拟,只是这个题意太难懂了
#include <cstdio> #include <iostream> #include <string> #include <algorithm> #include <cstring> #include <cmath> #include <map> using namespace std; int main() { int n=0,m=0; string a; int b[10005],c[10005]; cin>>a; int num[15005]; memset(num,0,sizeof(num)); int t=a.length()/2; for(int i=0;i<t;i++){ num[i]=a[i]-'A'; num[i+t]=a[i+t]-'A'; n+=num[i]; m+=num[i+t]; } for(int i=0;i<t;i++){ b[i]=(num[i]+n)%26; c[i]=(num[i+t]+m)%26; } char s[10005]; for(int i=0;i<t;i++) s[i]=((b[i]+c[i])%26)+'A'; for(int i=0;i<t;i++) cout<<s[i]; return 0; }
H题,dfs暴搜,水题
题意就是在图中找有多少闭环,直接dfs(因为边界wa了一次)
#include <cstdio> #include <iostream> #include <string> #include <algorithm> #include <cstring> #include <cmath> #include <map> using namespace std; int n,m; char s[100][100]; int vis[100][100]; void dfs(int i,int j,int sum){ vis[i][j]=1; for(int x=-1;x<=1;x++){ for(int y=-1;y<=1;y++){ int nx=i+x; int ny=j+y; if(nx>=0&&nx<n&&ny>=0&&ny<m&&vis[nx][ny]==0&&s[nx][ny]=='#') dfs(nx,ny,sum); } } } int main() { cin>>n>>m; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>s[i][j]; } } int sum=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(s[i][j]=='#'&&vis[i][j]==0){ dfs(i,j,sum++); } } } cout<<sum<<endl; return 0; }
最后是D题,模拟。。wa了挺多次
有n个同学传蛋,每次老师给出两个操作中的一种,一个操作是将蛋,按顺序传给别的同学,一种是撤销之前的m次操作(仅包含第一种操作(即不能撤销先前的撤销命令))
模拟,一开始用栈,后面用的数组,就是将每次操作后蛋的位置都存起来,然后撤销就回退覆盖先前的操作就OK了
#include <cstdio> #include <iostream> #include <string> #include <algorithm> #include <cstring> #include <cmath> #include <map> #include <stack> using namespace std; int main() { int n,m; int t=1; int num[1000]; num[0]=0; string s; int a,b; int sw; cin>>n>>m; for(int i=1;i<=m;i++){ cin>>s; if(s[0]=='u'){ cin>>a; t-=a+1; } else{ a=atoi(s.c_str()); sw=num[t-1]; sw+=a; sw%=n; if(sw<0) sw+=n; num[t]=sw; } t++; } cout<<num[t-1]<<endl; return 0; }