题解 | 多米诺骨牌

多米诺骨牌

https://www.nowcoder.com/practice/0757b8571cd047aab5dea52c1f369e55

这道题其实很简单喵~

首先我们让牌沿着位置顺序排序喵!(最简单的操作)

本喵从左到右挨个看小骨头:

  • 如果它是第一个小骨头,或者它站的位置比当前小团体能倒到的最右边还远,说明它不能和前面的小骨头一起倒,那就重新开一个小团体。
  • 否则,它就能加入当前的小团体,并且要更新最右边位置(如果它倒的范围比现在的更远的话)。

小金最多能推 m 个小骨头,每个小团体只要推最左边的一个,整个团就全倒,所以当然选最大的 m 个小团体最划算!把 duan 里前 m 个(如果不足 m 个就全取)加起来就是答案啦~

看代码喵!

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void solve() {
    int n, m;
    cin >> n >> m;
    vector<ll> h(n), x(n);
    for (int i=0;i<n;i++) cin >> h[i];
    for (int i=0;i<n;i++) cin >> x[i];
    vector<pair<ll, ll>> a(n);//存储每个牌的位置和高度
    for (int i=0;i<n;i++) a[i] = {x[i], h[i]};
    sort(a.begin(),a.end());// 按位置排序
    

    vector<ll> duan;// 存储每个连续段的大小
    ll now=0;// 当前段的大小
    ll maxR=-1;// 当前段能覆盖到的最远位置(右边界)
    
    for (int i=0;i<n;i++) {
        ll nx=a[i].first,nh=a[i].second;
        if (i==0||nx>maxR)// 新小团体开始
        { 
            if(now>0) duan.push_back(now);// 把前一个小团体的数量存起来
            now=1;// 新团体当前有1个牌
            maxR=nx+nh;// 新团体的最右边就是它倒的范围
        } 
        else // 加入当前团体
        {
            now++;// 团体人数+1
            maxR = max(maxR,nx+nh);// 更新最右边
        }
    }
    if(now>0) duan.push_back(now);// 别忘了最后一个小团体
    
    // 从大到小排序,取前 m 个
    sort(duan.rbegin(),duan.rend());
    ll ans=0;
    for (int i=0;i<min(m,(int)duan.size());i++) ans+=duan[i];
    cout << ans << '\n';
}

int main() {
    cin.tie(0)->sync_with_stdio(false);
    int t;
    cin >> t;
    while(t--) solve();
    return 0;
}
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⡀⣀⣠⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⢀⣴⣾⣷⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⠛⠉⠉⠉⠉⠉⠉⠛⠻⠿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⡿⠿⠛⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣀⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⣰⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣶⣄⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣻⣿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢹⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⠁⠈⢢⡀⠀⠀⠀⢸⡇⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⡟⠒⢦⡀⠀⠀⠀
⠀⠀⣠⣤⣤⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡇⠀⠀⠀⠉⢢⣄⠀⠀⢿⠊⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣷⡄⠀⢷⠀⠀⠀
⠀⢰⠇⠀⣰⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⡌⣹⠗⠦⣬⣇⠀⠉⢢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀⢸⡄⠀⠀
⠀⡟⠀⣼⣯⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣆⢹⡀⠀⠀⠀⠉⠁⠀⠀⢀⣀⡁⠀⠀⠉⠳⢴⡆⠀⠀⠀⠀⠀⠀⢹⣧⠈⡇⠀⠀
⠀⡇⠀⠀⢻⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣾⠻⠉⠛⠂⠀⠀⠀⠀⠀⠀⠻⠿⣿⣿⣿⣶⣦⡀⠛⣇⠀⠀⠀⠀⠀⣈⣿⠀⡇⠀⠀
⢸⡇⠀⠀⢠⣿⣷⣦⣀⡸⣷⣦⣶⡂⠉⠉⠉⢁⣤⣶⡶⠀⠀⠀⣀⣀⡴⠀⠀⠀⠀⠀⠀⠈⠉⠉⠁⠀⡟⢀⣴⣟⣰⣾⣿⣏⣠⠇⠀⠀
⠈⡇⠀⠀⢸⣿⠁⠉⣿⠛⠛⠃⡇⠀⠀⢠⣶⣿⡿⠛⠁⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠼⢿⠟⠿⢿⡏⠀⠘⣿⡀⠀⠀⠀
⠀⢷⣀⣀⣿⠇⠀⠀⢿⡇⠀⢀⢱⡀⠀⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠀⠀⢸⠇⠀⠀⢹⣿⣄⠀⠀
⠀⠀⣉⣿⡏⠀⠀⠀⠀⠀⠀⢸⣇⣳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⣿⠃⠀⠀⠀⠀⠀⠀⣿⠈⢧⠀
⠀⠘⣿⣿⠁⠀⠀⠀⠀⠀⠀⠘⣿⡛⣶⠀⠀⣠⠔⠒⠛⠒⠦⡀⠀⠀⠀⠀⣠⡤⠶⠤⢤⣀⠀⠀⠀⢀⣏⡄⠀⠀⠀⠀⠀⡀⣿⡆⠈⣧
⣠⡾⠛⣿⣿⣧⠀⠀⠀⠀⢸⣿⠾⢿⡿⠀⣰⠃⠀⠀⠀⠀⠀⢹⡄⠀⠀⡼⠁⠀⠀⠀⠀⠈⠙⣦⠀⢸⣿⡇⣾⣣⡀⠀⢰⣿⣿⣿⣤⠾
⡟⠀⠀⠻⣿⡟⢷⡄⣤⡀⠈⣿⡀⣸⠇⠀⠏⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⡇⢀⡀⠀⠀⠀⠀⢀⡟⠀⠀⠋⣿⣿⣿⡇⣠⣿⠿⠛⢷⡀⠀
⠀⠀⠀⠀⣿⣇⣨⣿⣿⣿⣦⣽⣷⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠃⠀⠙⠢⠤⠤⠴⢾⠀⠀⠀⠀⢸⣷⣿⣿⠟⠁⠀⠀⠈⣧⠀
⠀⠀⠀⠀⠈⠉⠉⠁⠈⠉⠈⢉⣿⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⣿⠀
*/

全部评论

相关推荐

评论
5
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
12178次浏览 107人参与
# 你的实习产出是真实的还是包装的? #
2126次浏览 43人参与
# 米连集团26产品管培生项目 #
6399次浏览 217人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7781次浏览 43人参与
# 简历第一个项目做什么 #
31855次浏览 345人参与
# 重来一次,我还会选择这个专业吗 #
433680次浏览 3926人参与
# 巨人网络春招 #
11410次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187363次浏览 1122人参与
# 牛客AI文生图 #
21472次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152600次浏览 888人参与
# 研究所笔面经互助 #
119000次浏览 577人参与
# 简历中的项目经历要怎么写? #
310590次浏览 4230人参与
# AI时代,哪些岗位最容易被淘汰 #
64117次浏览 839人参与
# 面试紧张时你会有什么表现? #
30533次浏览 188人参与
# 你今年的平均薪资是多少? #
213296次浏览 1039人参与
# 你怎么看待AI面试 #
180364次浏览 1268人参与
# 高学历就一定能找到好工作吗? #
64352次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76697次浏览 374人参与
# 我的求职精神状态 #
448246次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363811次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160736次浏览 1114人参与
# 校招笔试 #
471781次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务