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 }
View Code

 

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 }
View Code

 

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 }
View Code

 

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 }
View Code

 

E


并没有看...

posted @ 2016-05-26 10:34  晴歌。  阅读(219)  评论(0编辑  收藏  举报