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;

  }

}

  

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-02-27 17:14  dlutjwh  阅读(50)  评论(0编辑  收藏  举报