zoukankan      html  css  js  c++  java
  • Cdoefroces #354

    A题

    题意:给定一些数,然后求一次交换以后最大的数和最小的数之间的最大距离

    分析:找到最大数和最小数的位置,然后判断是把位置大的移到最后还是把位置小的移到开始位置即可

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=200;
    15 int a[maxn];
    16 int main()
    17 {
    18     int n;
    19     while(cin>>n)
    20     {
    21         int minx,maxx;
    22         for(int i=1;i<=n;i++)
    23             cin>>a[i];
    24         for(int i=1;i<=n;i++){
    25             if(a[i]==1)
    26             {
    27                 minx=i; break;
    28             }
    29         }
    30         for(int i=1;i<=n;i++){
    31             if(a[i]==n){
    32                 maxx=i; break;
    33             }
    34         }
    35         if(minx>maxx)
    36             swap(minx,maxx);
    37         cout<<maxx-minx+max(minx-1,n-maxx)<<endl;
    38     }
    39     return 0;
    40 }
    View Code

    B题

    题意:给定一些倒香槟的杯子,第一层1个,第二层2个,依此下去,问第t秒有多少个杯子水是满的

    分析:为了考虑精度问题,我们将t乘1024,然后进行模拟,对每1秒流下的水,到下下一层以后一定会变成(a[i][j]-1)/2

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=15;
    15 const int inf=1<<10;
    16 int a[maxn][maxn];
    17 int n,t;
    18 int main()
    19 {
    20     while(cin>>n>>t)
    21     {
    22         memset(a,0,sizeof(a));
    23         a[1][1]=t*inf;
    24         int ans=0;
    25         for(int i=1;i<=n;i++)
    26             for(int j=1;j<=i;j++){
    27                 if(a[i][j]>=inf){
    28                     ans++;
    29                     a[i+1][j]+=(a[i][j]-inf)/2;
    30                     a[i+1][j+1]+=(a[i][j]-inf)/2;
    31                 }
    32             }
    33         cout<<ans<<endl;
    34     }
    35     return 0;
    36 }
    View Code

    C题

    题意:给定一个字符串,可以改变其中k个字母,问最大的重复字串长度,字符串只含有a和b

    分析:这题是一个原题,对于区间[l,r],看其上0的数量是否大于k,若小于k,则[l+1,r]必然也小于k,统计[1,n]上的最大长度即可。统计的时候用二分思想,然后分别对a和b进行统计,最后求其最大值即可。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=100010;
    15 char s[maxn];
    16 int a[maxn],b[maxn],dp1[maxn],dp2[maxn];
    17 int n,k;
    18 int main()
    19 {
    20     while(cin>>n>>k)
    21     {
    22         memset(dp1,0,sizeof(dp1));
    23         //memset(a,0,sizeof(a));
    24         scanf("%s",s);
    25         for(int i=0;i<n;i++){
    26             int t=i;
    27             if(s[i]=='a')
    28                 a[++t]=1;
    29             else
    30                 a[++t]=0;
    31         }
    32         //for(int i=1;i<=n;i++)
    33         //    cout<<a[i];
    34         //cout<<endl;
    35         for(int i=1;i<=n;i++){
    36             if(!a[i])
    37                 dp1[i]=dp1[i-1]+1;
    38             else
    39                 dp1[i]=dp1[i-1];
    40             
    41         }
    42         int left1=0,right1=0,mx1=0,j1=0;
    43         for(int i=1;i<=n;i++){
    44             while(dp1[i]-dp1[j1]>k) j1++;
    45             if(mx1<i-j1){
    46                 mx1=i-j1;
    47                 left1=j1+1;
    48                 right1=i;
    49             }
    50         }
    51 
    52         memset(dp2,0,sizeof(dp2));
    53         //memset(b,0,sizeof(b));
    54         for(int i=0;i<n;i++){
    55             int h=i;
    56             if(s[i]=='b')
    57                 b[++h]=1;
    58             else b[++h]=0;
    59         }
    60 
    61         for(int i=1;i<=n;i++){
    62             if(!b[i])
    63                 dp2[i]=dp2[i-1]+1;
    64             else
    65                 dp2[i]=dp2[i-1];
    66         }
    67         int left2=0,right2=0,mx2=0,j2=0;
    68         for(int i=1;i<=n;i++){
    69             while(dp2[i]-dp2[j2]>k) j2++;
    70             if(mx2<i-j2){
    71                 mx2=i-j2;
    72                 left2=j2+1;
    73                 right2=i;
    74             }
    75         }
    76         cout<<max(mx1,mx2)<<endl;
    77     }
    78     return 0;
    79 }
    View Code
  • 相关阅读:
    LVS实现负载均衡原理及安装配置 负载均衡
    Jexus-5.6.3使用详解
    公共笔记
    net 网站过滤器 mvc webapi
    WebApi 生成帮助文档及顺便创建简单的测试工具
    Dapper.NET——轻量ORM
    C# Entity Framework并发处理
    linq 日常关键字使用
    解决nginx负载均衡的session共享问题
    table中实现数据上移下移效果
  • 原文地址:https://www.cnblogs.com/wolf940509/p/5534249.html
Copyright © 2011-2022 走看看