CodeForces_#354_Div.2_2016.5.25(A+B+C)
A
描述:给出一串数,可以互换任意两个数的位置一次,求最大的数和最小的数的最大距离.
分析:找到最大的数和最小的数的位置,求右边的数到左端点的距离和左边的数到右端点的距离.
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=200+5,INF=0x7fffffff; 5 int n,M1,M2,m1,m2; 6 int a[maxn]; 7 8 int main(){ 9 scanf("%d",&n); 10 M1=INF,M2=-INF; 11 for(int i=1;i<=n;i++){ 12 scanf("%d",&a[i]); 13 if(a[i]<M1) M1=a[i], m1=i; 14 if(a[i]>M2) M2=a[i], m2=i; 15 } 16 if(m1>m2) swap(m1,m2); 17 int ans=max(n-m1,m2-1); 18 printf("%d\n",ans); 19 }
B(模拟)
描述:酒杯落在一起,长得和数字三角形一样,每分钟倒一杯酒,满了会向两边流且流得一样多,问t分钟后有多少酒杯满了.
分析:模拟,一次性倒t杯酒(我sb地一杯一杯倒...TLE了好久).
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=10+5; 5 int n,t; 6 double a[maxn*maxn]; 7 8 int main(){ 9 scanf("%d%d",&n,&t); 10 a[1]=t; 11 int ans=0; 12 for(int i=1;i<=n;i++) 13 for(int j=1;j<=i;j++){ 14 int x=(i-1)*i/2+j; 15 if(a[x]>=1){ 16 ans++; 17 a[(i*i+i)/2+j]+=(a[x]-1)/2; 18 a[(i*i+i)/2+j+1]+=(a[x]-1)/2; 19 } 20 } 21 printf("%d\n",ans); 22 return 0; 23 }
C(尺取法)
描述:给出一个由a,b组成的字符串,最多能改变k个字符,问最多有多少相同的字符串连在一起.
分析:尺取法.注意k=0的情况.
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=100000+5; 5 int n,k; 6 int a[maxn]; 7 8 void solve(){ 9 int l=1,r=1,rem=k,ans=0; 10 while(l<=n&&r<=n){ 11 if(a[r]==0){ 12 while(rem==0&&l<r) 13 if(a[l++]==0) rem++; 14 if(rem) rem--; 15 else { l++; r++; continue; } 16 } 17 ans=max(ans,r-l+1); 18 r++; 19 } 20 l=1; r=1; rem=k; 21 while(l<=n&&r<=n){ 22 if(a[r]==1){ 23 while(rem==0&&l<r) 24 if(a[l++]==1) rem++; 25 if(rem) rem--; 26 else { l++; r++; continue; } 27 } 28 ans=max(ans,r-l+1); 29 r++; 30 } 31 printf("%d\n",ans); 32 } 33 void init(){ 34 scanf("%d%d\n",&n,&k); 35 for(int i=1;i<=n;i++){ 36 char c; c=getchar(); 37 if(c=='b') a[i]=1; 38 } 39 } 40 int main(){ 41 init(); 42 solve(); 43 return 0; 44 }
D(最短路+宽搜)
描述:一个迷宫,每个点可以通向四个方向中的一部分,只有两两相通的点才能走,也可以花费时间把所有点通向的方向顺时针旋转90度.求起点到终点花费的最短时间.
分析:一共就4张图,分别预处理出来.在一个点,要么就在原来的图上继续跑,要么走到顺时针旋转90度之后的图上去.(不看题解的我TLE).
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1000+5; 5 6 int n,m,ans,xs,ys,xt,yt,cnt; 7 int head[maxn*maxn*4]; 8 bool vis[maxn*maxn*4]; 9 bool t[maxn][maxn][4]; 10 struct edge{ 11 int to,next; 12 edge(int to=0,int next=0):to(to),next(next){} 13 }g[maxn*maxn*4*4]; 14 struct node{ 15 int x,step; 16 node(int x=0,int step=0):x(x),step(step){} 17 }; 18 inline int idx(int x,int y,int z){ return z*n*m+(x-1)*m+y; } 19 bool tag(int id){ 20 for(int i=0;i<4;i++) 21 if(idx(xt,yt,i)==id) return true; 22 return false; 23 } 24 void add_edge(int u,int v){ 25 g[++cnt]=edge(v,head[u]); head[u]=cnt; 26 g[++cnt]=edge(u,head[v]); head[v]=cnt; 27 } 28 void add_edge2(int u,int v){ 29 g[++cnt]=edge(v,head[u]); head[u]=cnt; 30 } 31 void bfs(){ 32 queue <node> q; 33 q.push(node(idx(xs,ys,0),0)); 34 while(!q.empty()){ 35 node t=q.front(); q.pop(); 36 int x=t.x,step=t.step; 37 if(tag(x)){ 38 ans=step; 39 return; 40 } 41 for(int i=head[x];i;i=g[i].next){ 42 int y=g[i].to; 43 if(vis[y]) continue; 44 vis[y]=true; 45 q.push(node(y,step+1)); 46 } 47 } 48 } 49 void init(){ 50 scanf("%d%d",&n,&m); 51 for(int i=1;i<=n;i++) 52 for(int j=1;j<=m;j++){ 53 char c; while(c=getchar(), c=='\n'); 54 if(c=='+') t[i][j][0]=t[i][j][1]=t[i][j][2]=t[i][j][3]=true; 55 else if(c=='-') t[i][j][1]=t[i][j][3]=true; 56 else if(c=='|') t[i][j][0]=t[i][j][2]=true; 57 else if(c=='^') t[i][j][0]=true; 58 else if(c=='>') t[i][j][1]=true; 59 else if(c=='v') t[i][j][2]=true; 60 else if(c=='<') t[i][j][3]=true; 61 else if(c=='U') t[i][j][1]=t[i][j][2]=t[i][j][3]=true; 62 else if(c=='R') t[i][j][0]=t[i][j][2]=t[i][j][3]=true; 63 else if(c=='D') t[i][j][0]=t[i][j][1]=t[i][j][3]=true; 64 else if(c=='L') t[i][j][0]=t[i][j][1]=t[i][j][2]=true; 65 } 66 for(int i=1;i<=n;i++) 67 for(int j=1;j<=m;j++){ 68 int x,y; 69 x=i; y=j+1;//R 70 if(x<=n&&y<=m){ 71 if(t[i][j][1]&&t[x][y][3]) add_edge(idx(i,j,0),idx(x,y,0)); 72 if(t[i][j][0]&&t[x][y][2]) add_edge(idx(i,j,1),idx(x,y,1)); 73 if(t[i][j][3]&&t[x][y][1]) add_edge(idx(i,j,2),idx(x,y,2)); 74 if(t[i][j][2]&&t[x][y][0]) add_edge(idx(i,j,3),idx(x,y,3)); 75 } 76 x=i+1; y=j;//D 77 if(x<=n&&y<=m){ 78 if(t[i][j][2]&&t[x][y][0]) add_edge(idx(i,j,0),idx(x,y,0)); 79 if(t[i][j][1]&&t[x][y][3]) add_edge(idx(i,j,1),idx(x,y,1)); 80 if(t[i][j][0]&&t[x][y][2]) add_edge(idx(i,j,2),idx(x,y,2)); 81 if(t[i][j][3]&&t[x][y][1]) add_edge(idx(i,j,3),idx(x,y,3)); 82 } 83 for(int k=0;k<4;k++) add_edge2(idx(i,j,k),idx(i,j,(k+1)%4)); 84 } 85 scanf("%d%d%d%d",&xs,&ys,&xt,&yt); 86 ans=-1; 87 } 88 int main(){ 89 init(); 90 bfs(); 91 printf("%d\n",ans); 92 return 0; 93 }
E
并没有看...