• Codeforces Round #418 (Div.2)


    题目链接: http://codeforces.com/contest/814

    A. An abandoned sentiment from past

    题意:给你一个含有n个数的序列,其中有k个数为0,再给你k个数,让你将序列中的0用这k个数代替,每个数只能用一次,问你能不能使替代后的n个数不是递增的,能则输出Yes,否则输出No

    将k个数从大到小排列,依次代替0,再判断是否递增即可

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int main(){
      int n,k;
      int a[105],b[105];
      cin>>n>>k;
      for(int i=0;i<n;i++)
        cin>>a[i];
      for(int i=0;i<k;i++)
        cin>>b[i];
      sort(b,b+k);
      int j=k-1;
      for(int i=0;i<n;i++){
        if(a[i]==0){
            a[i]=b[j];
            j--;
        }
      }
    for(int i=0;i<n-1;i++)
    if(a[i]>a[i+1]){
        cout<<"Yes"<<endl;
        return 0;
    }
    cout<<"No"<<endl;
    }

    B. An express train to reveries

    题意:有三个序列a,b,p,均含有n个整数其中p为标准序列是1到n的整数(不重复),而a和b中有且只有1个元素和p不同,a、b序列至少有一个元素不同(最多两个),给你序列a和b,让你求p

    a和b中要么一个元素不同,要么两个元素不同, 注意p中的元素各不相同用个数组记录a和b中已经相同的元素,若a和b只有一个元素不同,则将其改为未出现的元素即可,若有两个元素不同,则要考虑可能有一个元素在a或b里重复,再修改即可

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int c[1005];  int x,y,z,d,e,f;
    int main(){
      int n;
      int a[1005],b[1005];
      cin>>n;
      for(int i=0;i<n;i++)
        cin>>a[i];
      for(int i=0;i<n;i++)
        cin>>b[i];
    
        int k=0;
      for(int i=0;i<n;i++){
        if(a[i]!=b[i]){
        if(k==0){
            d=i;
            e=a[i];
            f=b[i];
        }
        else {
            x=i;
            y=a[i];
            z=b[i];
        }
        k++;
        }
        else c[a[i]]++;
      }
      if(k==2){
        if(c[a[d]]==0&&c[b[x]]==0)
            a[x]=z;
        else a[d]=f;
      }
      else {
             for(int i=1;i<=n;i++)
                if(c[i]==0)
                   a[d]=i;
      }
      for(int i=0;i<n-1;i++)
        cout<<a[i]<<" ";
      cout<<a[n-1]<<endl;
    }
    

    C. An impassioned circulation of affection

    题意:给你一个只含有n(n<=1500)小写字母的字符串s,有q个查询(q<=200000),每个查询给你一个数字m,和一个小写字母c,问你若最多可将原序列中的m个字符改为c,则改后的字符中最多能有多少个连续的c

    由于q很大,n很小,所以应该考虑预处理原字符串,对于每个字符c,计算从第i(i<=n)个字符到第j(i<=j<=n)个字符中与c不同的字符的个数ans,更新dp[c][ans]=max(dp[c][ans],j-i+1),这个dp数组表示什么呢,表示恰好修改ans个字符后的序列中最多含有的连续个c字符数,这和最后的答案有区别,因为有的不用修改ans次就能有相同的答案,故需再更新一下$dp[c][i]=max(dp[c][i-1],dp[c][i])$.

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #define MAXN 1005
    #define MAXM 30005
    using namespace std;
    int dp[1505][1505],d[1505][1005];
    string s;
    int main(){
    int l;
    cin>>l;
     for(int i=1;i<=l;i++){
        cin>>s[i];
     }
    for(int k='a';k<='z';k++)
     for(int i=1;i<=l;i++){
        int ans=0;
        for(int j=i;j<=l;j++){
          if(s[j]!=k)
           ans++;
           dp[k][ans]=max(dp[k][ans],j-i+1);
        }
     }
     for(int k='a';k<='z';k++)
     for(int i=1;i<=l;i++)
        dp[k][i]=max(dp[k][i-1],dp[k][i]);
      int n;
      cin>>n;
      for(int i=0;i<n;i++){
        char a;int b;
        cin>>b>>a;
        cout<<dp[a][b]<<endl;
    
      }
    
    }
    

      

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    cinder-volume报错vmdk2 is reporting problems, not sending heartbeat. Service will appear "down".
    Linux下截取指定时间段日志并输出到指定文件
    使用diff或者vimdiff比较远程文件(夹)与本地文件夹
    OpenStack视图
    awk 计算某一列的和
    opencontrail—VXLAN模式下数据包的传输过程
    shell-计算虚拟机创建时间
    gnocchi resource批量删除
    openflow控制器和交换机之间的消息
    openflow packet_out和packet_in分析
  • 原文地址:https://www.cnblogs.com/dlutjwh/p/10986897.html
Copyright © 2020-2023  润新知