codeforces 766A-C

又到了周末刷cf 的时候了!这套题好水的样子,然而用并查集写的D调了一晚上都有问题,有点崩溃,过两天再重新写。
A就是两串的长度的较大值,或者两个串相等时-1
B题排序后三位一比较,如果有a[n]+a[n+1]>a[n+2]就可以。
C题看着有点吓人,其实第一第二问是可以一起算出来的。dp[i]表示前i个字母有几种,dp[i+1]=dp[i]+dp[i-1]+…+dp[i-k],k是满足从字符串第i-k+1位到第i位的字母的约束值都大于等于k的最大整数。然后第一问就是dp[N],第二问就是最大的k。第三问贪心跑一遍就行。数组开小了WA了一次。
下面是代码

#include<iostream>
#include<string>
using namespace std;
int main(){
    string a,b;
    cin>>a>>b;
    if(a==b)cout<<-1;
    else if(a.length()>b.length())cout<<a.length();
    else cout<<b.length();
    return 0;
}
#include<stdio.h>
#include<algorithm>
int a[100020];
int main(){
    int T;
    scanf("%d",&T);
    if(T>=45){
            printf("YES");
            return 0;
        }
    for(int i=0;i<T;i++){
        scanf("%d",a+i);
    }
    std::sort(a,a+T);
    for(int i=0;i<=T-3;i++){
        if(a[i]+a[i+1]>a[i+2]){
            printf("YES");
            return 0;
        }
    }
    printf("NO");
    return 0;
}
#include<stdio.h>
#define min(x,y) (x)<(y)?(x):(y)
const int mod=1e9+7;
char str[1001];
int t[227], dp[1001];
int main(){
    int T,ans2=-1,ans3=0,k=0;
    scanf("%d%s",&T,str);
    for(int i=0;i<26;i++)
        scanf("%d",t+i+'a');
    dp[0]=1;
    for(int i=1;i<=T;i++){
        int m=t[str[i-1]],j=2;
        dp[i]=dp[i-1];
        for(;j<=i+1;j++){
            m=min(m,t[str[i-j]]);
            if(m<j)
                break;
            dp[i]+=dp[i-j];
            while(dp[i]>mod)dp[i]-=mod;
        }
        if(ans2<j)ans2=j;
        if(i-j+1>k){
            ans3++;
            k=i-1;
        }
    }
    printf("%d\n%d\n%d",dp[T],ans2-1,ans3+1);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值