JZOJ 3.2 A组总结
T1
分析
水题,设每个小三角形的坐标为(x,y,z),x表示三角形正着放的时候的层数,y表示三角形旋转60°的层数,z则是旋转120°的
然后到每个出口的时间就是|sx-xi|+|sy-yi|+|sz-zi|
坐标怎么计算很简单
#include <iostream> #include <cstdio> using namespace std; const int N=1e6+10; int n,m,sx,sy,out[2]; int abs(int x) { return x<0?-x:x; } int main() { scanf("%d%d%d%d",&n,&m,&sx,&sy); int ans=2147483647; for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); int k=abs(sx-x)+abs((sx*2-sy+1>>1)-(x*2-y+1>>1))+abs((sy-1>>1)-(y-1>>1)); if (ans>=k) { if (ans==k) { if (out[0]>=x) { out[0]=x; if (out[0]==x&&out[1]>y) out[1]=y; } } else out[0]=x,out[1]=y; ans=k; } } printf("%d %d\n%d\n",out[0],out[1],ans+1); }
T2
分析
乍一看像个树形DP,事实上不是。
ans=1-w[]+2-w[]+..+3-w[]+路径长度
然后思考一下其实走到的顺序与最终值无关,最终值大小只跟路径长度有关
然后说明度只能是偶数,那就随便搞个欧拉回路就好了
#include <iostream> #include <cstdio> using namespace std; const int N=210; int g[N][N],ans[100010]; int n,m; void DFS(int u) { for (int i=1;i<=n;i++) if (g[u][i]) g[u][i]--,g[i][u]--,DFS(i); ans[++ans[0]]=u; } int main() { scanf("%d%d",&n,&m); for (int i=1,w;i<=n;i++) scanf("%d",&w); for (int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),g[u][v]++,g[v][u]++; DFS(1); printf("%d\n",ans[0]-1); for (int i=ans[0];i;i--) printf("%d ",ans[i]); }
T3
分析
Floyd即可。。多加一维统计经过路径条数。。卡常就过了
#include <cstdio> using namespace std; const int N=60; const int M=1e3+10; int n,m,q; int g[N][N][M]; inline int min(int a,int b) { return a>b?b:a; } inline double dmin(double a,double b) { return a>b?b:a; } int main() { scanf("%d%d",&n,&m); for (register int i=1;i<=n;i++) for (register int j=1;j<=n;j++) for (register int k=1;k<=m;k++) g[i][j][k]=0x3f3f3f3f; for (register int i=1,u,v,w;i<=m;++i) scanf("%d%d%d",&u,&v,&w),g[u][v][1]=min(g[u][v][1],w); for (register int k=2;k<=m;++k) for (register int l=1;l<=n;++l) for (register int i=1;i<=n;++i) for (register int j=1;j<=n;++j) g[i][j][k]=min(g[i][j][k],g[i][l][k-1]+g[l][j][1]); for (scanf("%d",&q);q;--q) { int a,b; double ans=2147483647.0; scanf("%d%d",&a,&b); for (register int i=1;i<=n;++i) if (g[a][b][i]!=0x3f3f3f3f) ans=dmin(ans,(double)g[a][b][i]/i); if (ans==2147483647.0) printf("OMG!\n"); else printf("%.3lf\n",ans); } }
在日渐沉没的世界里,我发现了你。