Codeforces922 D. Robot Vacuum Cleaner(sort)

题意:

给定n个由字符’s’和字符’h’组成的串,你可以以任意顺序拼接这些串,使得结果串的"sh"子序列数量最多。
输出最大数量。

数据范围:n<=1e5,所有串总长度<=1e5

解法:

令 e [ i ] . a 为 第 i 个 串 中 s 的 个 数 令 e [ i ] . b 为 第 i 个 串 中 h 的 个 数 令 e [ i ] . c 为 第 i 个 串 本 身 的 贡 献 . 显 然 不 管 如 何 排 序 , e [ i ] . c 都 不 会 收 到 影 响 串 拼 接 之 后 的 总 贡 献 为 : a n s = ∑ i = 1 n e [ i ] . c + ∑ i = 1 n p r e [ i ] ∗ e [ i ] . b 其 中 p r e [ i ] 表 示 串 i 左 边 的 字 符 ′ s ′ 的 数 量 . 对 于 两 个 相 邻 串 i , j , 当 前 的 贡 献 为 : p r e ∗ e [ i ] . b + ( p r e + e [ i ] . a ) ∗ e [ j ] . b 对 于 两 个 相 邻 串 j , i , 当 前 的 贡 献 为 : p r e ∗ e [ j ] . b + ( p r e + e [ j ] . a ) ∗ e [ i ] . b 若 i , j 能 使 得 答 案 更 优 , 那 么 必 须 满 足 : p r e ∗ e [ i ] . b + ( p r e + e [ i ] . a ) ∗ e [ j ] . b > p r e ∗ e [ j ] . b + ( p r e + e [ j ] . a ) ∗ e [ i ] . b 化 简 得 : e [ i ] . a ∗ e [ j ] . b > e [ j ] . a ∗ e [ i ] . b 按 照 这 个 规 则 对 e [ ] 排 序 即 可 . 令e[i].a为第i个串中s的个数\\ 令e[i].b为第i个串中h的个数\\ 令e[i].c为第i个串本身的贡献.\\ 显然不管如何排序,e[i].c都不会收到影响\\ 串拼接之后的总贡献为:\\ ans=\sum_{i=1}^ne[i].c+\sum_{i=1}^npre[i]*e[i].b\\ 其中pre[i]表示串i左边的字符's'的数量.\\ 对于两个相邻串i,j,当前的贡献为:\\ pre*e[i].b+(pre+e[i].a)*e[j].b\\ 对于两个相邻串j,i,当前的贡献为:\\ pre*e[j].b+(pre+e[j].a)*e[i].b\\ 若i,j能使得答案更优,那么必须满足:\\ pre*e[i].b+(pre+e[i].a)*e[j].b>pre*e[j].b+(pre+e[j].a)*e[i].b\\ 化简得:\\ e[i].a*e[j].b>e[j].a*e[i].b\\ 按照这个规则对e[]排序即可. e[i].aise[i].bihe[i].ci.,e[i].c:ans=i=1ne[i].c+i=1npre[i]e[i].bpre[i]is.i,j,:pree[i].b+(pre+e[i].a)e[j].bj,i,:pree[j].b+(pre+e[j].a)e[i].bi,j使,:pree[i].b+(pre+e[i].a)e[j].b>pree[j].b+(pre+e[j].a)e[i].b:e[i].ae[j].b>e[j].ae[i].be[].

code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e5+5;
struct Node{
    int a,b,c;
}e[maxm];
int n;
bool cmp(Node a,Node b){
    return a.a*b.b>b.a*a.b;
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        string s;cin>>s;
        for(auto x:s){
            if(x=='s'){
                e[i].a++;
            }else{
                e[i].b++;
                e[i].c+=e[i].a;
            }
        }
    }
    sort(e+1,e+1+n,cmp);
    int ans=0;
    int cnt=0;
    for(int i=1;i<=n;i++){
        ans+=e[i].c;
        ans+=cnt*e[i].b;
        cnt+=e[i].a;
    }
    cout<<ans<<endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
08-10
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
CodeForces - 616D是一个关于找到一个序列中最长的第k好子段的起始位置和结束位置的问题。给定一个长度为n的序列和一个整数k,需要找到一个子段,该子段中不超过k个不同的数字。题目要求输出这个序列最长的第k好子段的起始位置和终止位置。 解决这个问题的方法有两种。第一种方法是使用尺取算法,通过维护一个滑动窗口来记录\[l,r\]中不同数的个数。每次如果这个数小于k,就将r向右移动一位;如果已经大于k,则将l向右移动一位,直到个数不大于k。每次更新完r之后,判断r-l+1是否比已有答案更优来更新答案。这种方法的时间复杂度为O(n)。 第二种方法是使用枚举r和双指针的方法。通过维护一个最小的l,满足\[l,r\]最多只有k种数。使用一个map来判断数的种类。遍历序列,如果当前数字在map中不存在,则将种类数sum加一;如果sum大于k,则将l向右移动一位,直到sum不大于k。每次更新完r之后,判断i-l+1是否大于等于y-x+1来更新答案。这种方法的时间复杂度为O(n)。 以上是两种解决CodeForces - 616D问题的方法。具体的代码实现可以参考引用\[1\]和引用\[2\]中的代码。 #### 引用[.reference_title] - *1* [CodeForces 616 D. Longest k-Good Segment(尺取)](https://blog.csdn.net/V5ZSQ/article/details/50750827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces616 D. Longest k-Good Segment(双指针+map)](https://blog.csdn.net/weixin_44178736/article/details/114328999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值