栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

AtCoder Beginner Contest 249题解(E,F)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AtCoder Beginner Contest 249题解(E,F)

E - RLE

题目大意:有一个长度为 N 的只含有小写字母字符串 S ,将S中连续相同的字母用计数法表示,如 aaa -> a3,

aaabbbcc -> a3b3c2。现在要求用计数法表示后长度严格小于原来长度的 S 数量,要求对P取模。

分析:考虑动态规划:

​ 设 f[ i ] [ j ]为 长度为 i 的字符串 用计数法表示后长度为 j 的数量 。

​ sum[ i ] [ j ] 为法 f[ i ] [ j ] 前缀和。

当从最开始放字母时 可以放26种,若不是开始,要与前面的不同,只能放25种。

因为 n最多为2000 ,所以最多只有以下四种情况:

​ (1)放入长度为 1~9 的连续字符串 ,用计数法表示后长度为 2。

​ (2)放入长度为 10~99 的连续字符串 ,用计数法表示后长度为 3。

​ (3)放入长度为 100~999 的连续字符串 ,用计数法表示后长度为 4。

​ (4)放入长度为 1000~9999 的连续字符串 ,用计数法表示后长度为 5。

然后注意一下边界即可,具体转移见代码:

int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cout << fixed << setprecision(7);
 
    int n;
    cin >> n >> mod;
 
    vector> f(n+1,vector(n+1,0));
    vector> sum(n+1,vector(n+1,0));
 
    for(int i=1;i<=n;i++){
        int k=1+to_string(i).size();
        if(k
            f[i][k]+=26;//从头开始放
        }
        for(int j=2;j
            f[i][j] += 25*(sum[max(0,i-1)][max(0,j-2)] - sum[max(0,i-10)][max(0,j-2)]);//第一种情况
            f[i][j] += 25*(sum[max(0,i-10)][max(0,j-3)] - sum[max(0,i-100)][max(0,j-3)]);//第二种情况
            f[i][j] += 25*(sum[max(0,i-100)][max(0,j-4)] - sum[max(0,i-1000)][max(0,j-4)]);//第三种情况
            f[i][j] += 25*(sum[max(0,i-1000)][max(0,j-5)] - sum[max(0,i-10000)][max(0,j-5)]);//第四种情况
            sum[i][j] = sum[i-1][j] + f[i][j];
        }
    }
 
    modint ans;
    for(int i=1;i
        ans+=f[n][i];
    }
 
    cout << ans.val();
 
    return 0;
}
F - Ignore Operations

题目大意:最初 x 为 0 ,有 N 个操作 ,操作有2种类型:

​ (1) y 替换 x

​ (2) x 加上y

​ 你可以跳过最多k次操作,求操作完后最大的 x。

分析:考虑贪心。

假如后面有操作1不跳过,前面的操作不用跳了(没必要),所以当考虑某个操作1不跳时,后面的操作1必须全跳。

我们从后往前枚举第i的操作1不跳,把后面操作2为负数的用一个大根堆维护(正数直接加就好了),大小为 k - (已经跳过的操作1个数),然后更新最大值就可以了,具体见代码。

int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cout << fixed << setprecision(7);
 
 
    int n,k;
 
    cin >> n >> k;
    vector a(n+1);
 
    for(int i=1;i<=n;i++) cin >> a[i].fi >> a[i].se;
 
    a[0] = {1,0};
 
    priority_queue pq;
 
    LL sum=0,psum=0,ans=-1e18;
 
    for(int i=n;i>=0;i--){
        int op=a[i].fi,x=a[i].se;
        if(op==1){
            ans = max(ans,x+sum-psum);
            if(k==0) break;
            k--;
            if(pq.size()>k){
                psum-=pq.top();
                pq.pop();
            }
        }else{
            if(x<0){
                if(pq.size()
                    psum+=x;
                    pq.push(x);
                }else if(pq.size()&&pq.top()>x){
                    psum-=pq.top();
                    pq.pop();
                    pq.push(x);
                    psum+=x;
                }
            }
            sum+=x;
        }
    }
 
    cout << ans << 'n';
 
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832479.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号