妈妈我再也不要斗地主了
心态蹦了啊最后一道题改了两个多小时都没改全对
好了回归正题来一波今天考试总结加题解
T1 神奇幻方
其实就是一道很简单的模拟题,根据题目所给的信息来模拟就可以了,可以记录一个前驱这样可以很快的判断
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=45; int mat[maxn][maxn]; int n,prex,prey; int main() { freopen("magic.in","r",stdin); freopen("magic.out","w",stdout); scanf("%d",&n); int mid=(1+n)>>1; mat[1][mid]=1; prex=1; prey=mid; for (int i=2;i<=n*n;i++) { if (prex==1&&prey!=n) { mat[n][prey+1]=i; prex=n; prey=prey+1; continue; } if (prey==n&&prex!=1) { mat[prex-1][1]=i; prex=prex-1; prey=1; continue; } if (prex==1&&prey==n) { mat[prex+1][prey]=i; prex=prex+1; } if (prex!=1&&prey!=n) { if (mat[prex-1][prey+1]==0) { mat[prex-1][prey+1]=i; prex=prex-1; prey=prey+1; } else { mat[prex+1][prey]=i; prex=prex+1; } } } for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) printf("%d ",mat[i][j]); printf("\n"); } return 0; }
T2 信息传递
呃呃呃据说旁边的大佬用并查集做出来了啊啊
但是这道题其实很简单啊,每个人只能连出一条边,所以最多形成一个环,直接Tarjan求个最小环就可以了
#include<cstring> #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=200005; int dfn[maxn],color[maxn],low[maxn],colorv[maxn]; int head[maxn],nxt[maxn],tov[maxn],stk[maxn*2]; bool vis[maxn]; int n,tot=0,top=0,cnt=0,idx=0,ans=1e9; void add(int u,int v) { tot++; tov[tot]=v; nxt[tot]=head[u]; head[u]=tot; } void tarjan(int u) { idx++; low[u]=dfn[u]=idx; stk[++top]=u; vis[u]=1; for (int i=head[u];i;i=nxt[i]) { int v=tov[i]; if (!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if (vis[v]) { low[u]=min(dfn[v],low[u]); } } if (dfn[u]==low[u]) { cnt++; while (1) { int p=stk[top]; top--; vis[p]=0; color[p]=cnt; colorv[cnt]++; if (p==u) break; } } } int main() { freopen("message.in","r",stdin); freopen("message.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++) { int to; scanf("%d",&to); add(i,to); } for (int i=1;i<=n;i++) if (!dfn[i]) tarjan(i); for (int i=1;i<=n;i++) { if (colorv[color[i]]>=2&&colorv[color[i]]<ans) ans=colorv[color[i]]; } printf("%d\n",ans); return 0; }
message拼错了强行摔锅给李尬书
T3不解释了真的考验代码能力
按照题目顺序模拟单顺,双顺,三顺,三带一二,四带二的情况,根最优情况可以剪枝
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int T,n,x,y,ans; int a[20]; void clear() { memset(a,0,sizeof(a)); ans=0; } bool check() { for (int i=1;i<=15;++i) if (a[i]) return false; return true; } void dfs(int dep) { if (dep>ans) return; if (check()) { ans=min(ans,dep); return; } int sum=0; for (int i=1;i<=13;++i) if (a[i]) sum++; if (a[14]+a[15]) sum++; ans=min(ans,dep+sum); for (int kind=1;kind<=5;++kind) { if (kind==1) { for (int i=1;i<=8;++i) if (a[i]) { bool flag=true; for (int j=i+1;j<=i+3;++j) if (!a[j]) {flag=false;break;} if (!flag) continue; for (int j=i+4;j<13&&a[j];++j) { for (int k=i;k<=j;++k) --a[k]; dfs(dep+1); for (int k=i;k<=j;++k) ++a[k]; } } } if (kind==2) { for (int i=1;i<=10;++i) if (a[i]>=2&&a[i+1]>=2) for (int j=i+2;j<13&&a[j]>=2;++j) { for (int k=i;k<=j;++k) a[k]-=2; dfs(dep+1); for (int k=i;k<=j;++k) a[k]+=2; } } if (kind==3) { for (int i=1;i<=11;++i) if (a[i]>=3) { if (a[i+1]<3) continue; for (int j=i;j<13&&a[j]>=3;++j) { for (int k=i;k<=j;++k) a[k]-=3; dfs(dep+1); for (int k=i;k<=j;++k) a[k]+=3; } } } if (kind==4) { for (int i=1;i<=13;++i) if (a[i]>=3) { a[i]-=3; for (int j=1;j<=15;++j) if (a[j]) { --a[j]; dfs(dep+1); ++a[j]; } for (int j=1;j<=15;++j) if (a[j]>=2) { a[j]-=2; dfs(dep+1); a[j]+=2; } a[i]+=3; } } if (kind==5) { for (int i=1;i<=15;++i) if (a[i]>=4) { a[i]-=4; for (int j=1;j<=15;++j) if (a[j]) { --a[j]; for (int k=j;k<=15;++k) if (a[k]) { --a[k]; dfs(dep+1); ++a[k]; } ++a[j]; } a[i]+=4; } for (int i=1;i<=15;++i) if (a[i]>=4) { a[i]-=4; for (int j=1;j<=15;++j) if (a[j]>=2) { a[j]-=2; for (int k=j;k<=15;++k) if (a[k]>=2) { a[k]-=2; dfs(dep+1); a[k]+=2; } a[j]+=2; } a[i]+=4; } } } } int main() { freopen("landlords.in","r",stdin); freopen("landlords.out","w",stdout); scanf("%d%d",&T,&n); while (T--) { clear(); for (int i=1;i<=n;++i) { scanf("%d%d",&x,&y); if (!x) a[y+13]++; if (x==1||x==2) a[x+11]++; if (x>=3) a[x-2]++; } for (int i=1;i<=13;++i) if (a[i]) ans++; if (a[14]+a[15]) ans++; dfs(0); printf("%d\n",ans); } }
今天的考试总体来说不难T1,T2基本送分,T3考验一波代码能力,然后就是一波面向数据的编程,
问题还是不大,继续搞图论刷题去了