• 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
    ",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
    ",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
    ",ans);
    32 }
    33 void init(){
    34     scanf("%d%d
    ",&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=='
    ');
    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
    ",ans);
    92     return 0;
    93 }
    View Code

     

    E


    并没有看...

  • 相关阅读:
    逻辑卷扩容
    iptables网络防火墙||SNAT,DNAT等转发路由动作
    常用rman操作语句
    常用Oracle的SQL语句
    oracle中的单引号和双竖线||以及q'间隔符
    网站升级HTTPS教程
    站长必备:网站被黑后怎么快速搞定
    常见HTTP错误代码
    在Android中实现一个简易的Http服务器
    Android开发新手常见的10个误区
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5530116.html
Copyright © 2020-2023  润新知