Codeforces Round #506 (Div. 3) 题解

Codeforces Round #506 (Div. 3)

题目总链接:https://codeforces.com/contest/1029

A. Many Equal Substrings

题意:

给出长度为n的字符串,然后要求你添加一些字符,使得有k个这样的字符串。

题解:

直接暴力吧...一个指针从1开始,另一个从2开始,逐一比较看是否相同;如果不同,第一个指针继续回到1,第二个指针从3开始...就这么一直重复。最后如果第二个指针能够顺利到最后一位,那么记录当前的第一个指针,把他后面的串取出来添加k-1个就ok了。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 55;
string s;
int n,k;
int main(){
    cin>>n>>k;
    cin>>s;
    int fir = 0,last = 1;
    for(int i=1;i<n;i++){
        if(s[fir]==s[i]) fir++;
        else if(fir) fir = 0,i=last+1,last=i;
    }
    string tmp = s.substr(fir,n);
    for(int i=1;i<k;i++) s+=tmp;
    cout<<s;
    return 0;
}
View Code

B. Creating the Contest

题意:

给出n个数,选出最长的区间,满足区间中的相邻两个数a,b有2*a>=b且a<b。

题解:

枚举+判断一下就ok了。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int N = 2e5+5;
ll a[N];
int n;
int main(){
    scanf("%d",&n);
    int l=1,r=1,ans=1;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=2;i<=n;i++){
        if(a[i]<=a[i-1]*2){
            r++;
            ans=max(ans,r-l+1);
        }else{
            l=r=i;
        }
    }
    cout<<ans;
    return 0;
}
View Code

C. Maximal Intersection

题意:

给出n个区间,然后你可以任意去掉一个区间,最后求区间交集的最大值为多少。

题解:

区间的交集就是[maxl,minr]...根据这个求出前缀、后缀的l和r,然后枚举去掉哪个区间就行了。注意一下这里区间的交集是所有区间的交集。

代码如下:

猜你喜欢

转载自www.cnblogs.com/heyuhhh/p/10294095.html