滑稽的题
T1
#include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<cstdio> #include<cmath> #include<ctime> using namespace std; int n; int a,b,x; int main() { // freopen("book.in","r",stdin); // freopen("bok.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); if(x==5) { a++; continue; } if(x==10) { if(a) { a--; b++; continue; }else { printf("No "); return 0; } } if(x==20) { if(a&&b) { a--; b--; continue; } if(a>=3&&(!b)) { a-=3; continue; } printf("No "); return 0; } } printf("YES "); return 0; }
奇怪我手动测得都对,而且超时也不太可能吧。? 待解决。
模拟白
T2
#include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<cstdio> #include<cmath> #include<ctime> using namespace std; const int N=1e6+100; int n,m; int sum[N],a[N]; bool is[N]; int main()//又来模拟? { freopen("program.in","r",stdin); freopen("program.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(int i=1,x;i<=m;i++) { scanf("%d",&x); is[x]=1; } for(int i=1;i<=n;i++) { if(is[i]) sum[a[i]]--; else sum[a[i]]++; if(sum[a[i]]<0) { printf("NO "); return 0; } } for(int i=1;i<=n;i++) { if(sum[i]<0||(sum[i]%2)) { printf("NO "); return 0; } sum[i]/=2; } for(int i=n;i>=1;i--) if(!is[i])//要不是掉下这一步我就可能A了。 { if(sum[a[i]]) { is[i]=1; sum[a[i]]--; } } for(int i=1;i<=n;i++) { if(is[i]) printf("-%d ",a[i]); else printf("+%d ",a[i]); } return 0; }
括号翻转,站。
区间dp。
但我觉得,模拟就ok。
T3
#include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<cstdio> #include<cmath> #include<ctime> using namespace std; const int N=14; int h[N],nex[N*2],to[N*2],w[N*2],cnt; int n,m,q; int x,y,z; void add() { scanf("%d%d%d",&x,&y,&z); to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt,w[cnt]=z; to[++cnt]=x,nex[cnt]=h[y],h[y]=cnt,w[cnt]=z; } int kid[N][2]; bool vis[N]; int A,B,flag; void dfs(int x) { if(x==B) { bool is=1; for(int i=1;i<=10;i++) { if(kid[i][0]&&(!kid[i][1])) is=0; if(kid[i][1]&&(!kid[i][0])) is=0; if(abs(kid[i][0]-kid[i][1])%2) is=0; } if(is) flag=1; return ; } for(int i=h[x],v;i;i=nex[i]) if(!vis[to[i]]) { vis[to[i]]=1; if(w[i]>0) kid[w[i]][1]++; else kid[-w[i]][0]++; dfs(to[i]); vis[to[i]]=0; if(w[i]>0) kid[w[i]][1]--; else kid[-w[i]][0]--; } } int main() { freopen("maze.in","r",stdin); freopen("maze.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) add(); scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d%d",&A,&B); flag=0; vis[A]=1; dfs(A); if(flag) printf("YES "); else printf("NO "); } return 0; }
预处理Floyed dp
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> using namespace std; int n,m; int g[105][105][40],q[105*105*40][3],t,x,y,z; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); if(!z) { if(z<0) z=-z; else z+=10; g[x][y][z]=g[y][x][z]=1; }else { g[x][y][z]=g[y][x][z]=1; t++;q[t][0]=x,q[t][1]=y,q[t][2]=0; t++;q[t][0]=y,q[t][1]=x,q[t][0]=0; } } for(int i=1;i<=n;i++) { t++; q[t][0]=i; q[t][1]=i; q[t][2]=0; } for(int s=1;s<=t;s++) { int x=q[s][0]; int y=q[s][1]; int kid=q[s][2]; if(!kid) for(int i=1;i<=n;i++) if(g[i][x][kid-10]==1&&g[i][y]==0) { g[i][y][0]=1; t++; q[t][0]=i; q[t][1]=y; q[t][2]=0; } else for(int i=1;i<=10;i++) { if(g[i][x]&&(!g[i][y])) { g[i][y]=1; t++; q[t][0]=i; q[t][1]=y; q[t][2]=0; } if(g[y][i]&&(!g[x][i])) { g[x][i]=1; t++; q[t][0]=x; q[t][1]=i; q[t][2]=0; } for(int j=1;j<=10;j++) if(g[y][i][j]&&(!g[x][i][j+20])) { g[x][i][j+20]=1; t++; q[t][0]=x; q[t][1]=i; q[t][2]=j+20; } } } int q; scanf("%d",&q); while(q--) { scanf("%d%d",&x,&y); if(g[x][y][0]) printf("YES "); else printf("NO "); } return 0; }