首页 > 其他分享 >2024牛客暑期多校训练营3

2024牛客暑期多校训练营3

时间:2024-07-28 13:50:49浏览次数:14  
标签:emplace cout int ++ 多校 2024 牛客 vector go

A.Bridging the Gap 2

题目大意 :有n个人要划船过河(只有一艘船),每个人有\(h_i\)的体力,每次划船最少要L人,最多R人,划船要消耗船上所有人1的体力,问存不存在一种方案可以让所有人过河。
思路 :首先除了最后一次,前面的都需要有L人把船开回来,所以要有L人体力大于三,即可以算出一共需要\(t=\lceil \frac {n-R}{r-L} \rceil\)趟可以运完所有人。每个人可以划的趟数为\(a_i=\lfloor \frac {h_i-1}{2} \rfloor\),满足\(\sum_1^n min(a_i,t)\geq t*l\)即可

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 5e5 + 10;

int h[N];

void solve() {
    int n,l,r;
    cin >> n>>l>>r;
    int t=(n-r)/(r-l)+((n-r)%(r-l)!=0);
    int sum=0;
    for(int i=0;i<n;i++){
        cin >> h[i];
        sum+=min((h[i]-1)/2,t);
    }
    if(sum>=t*l) cout <<"Yes";
    else cout <<"No";
}


signed main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);
    int _ = 1;
//    cin >> _;
    while (_--) {
        solve();
    }
    return 0;
}

D.Dominoes!

题目大意 给出n块多米诺骨牌,每块上有两个数字,给出一种排列顺序使相邻多米诺骨牌上头尾数字不同,如(a,b)(c,d)(e,f),若\(b\neq c,d\neq e\)即合法。
思路 :若一块多米诺骨牌上两个数字不相同则通过翻转一定可以放在末尾,所以处理数字相同的多米诺骨牌即可。

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 5e5 + 10;
#define debug(x) cerr<<"! x="<<x<<'\n'
map<int, int> num2;
map<int, int> same;
vector<pair<int, int> > k;
vector<pair<int, int>> ans;

void solve() {
    int n;
    cin >> n;
    int f = 0;
    for (int i = 0; i < n; i++) {
        int a, b;
        cin >> a >> b;
        if (a == b) {
            same[a]++;
        } else k.emplace_back(a, b);
        num2[a]++;
        num2[b]++;
        if (num2[a] > n + 1 || num2[b] > n + 1) f = 1;
    }
    int len=k.size();
    if (f) {
        cout << "No";
        return;
    }
    cout << "Yes" << '\n';
    priority_queue<pair<int, int> > d;
    for (auto i: same) {
        d.emplace(i.second, i.first);
    }
    while (d.size() >= 2) {
        auto [sa, na] = d.top();
        d.pop();
        auto [sb, nb] = d.top();
        d.pop();
        ans.emplace_back(na, na);
        ans.emplace_back(nb, nb);
        if (sa > 1) d.emplace(sa - 1, na);
        if (sb > 1) d.emplace(sb - 1, nb);
    }
    if (d.size() == 1) {
        auto [cnt, val] = d.top();
        if(ans.empty()||ans.back().second!=val){
            ans.emplace_back(val,val);
            cnt--;
        }
        while(cnt){
            for(int i=0;i<len;i++){
                int a=k[i].first;
                int b=k[i].second;
                if(a==0) continue;
                if(a!=val&&b!=val){
                    cnt--;
                    ans.emplace_back(a,b);
                    ans.emplace_back(val,val);
                    k[i]={0,0};
                }
                if(cnt==0) break;
            }
        }
    }
    int p = -1;
    if(ans.size()) p = ans.back().second;
    for (auto i: k) {
        if (i.first == 0) continue;
        if (i.first == p) {
            ans.emplace_back(i.second, i.first);
        } else {
            ans.emplace_back(i.first, i.second);
            p = i.second;
        }
    }
    for (auto i: ans) {
        cout << i.first << ' ' << i.second << "\n";
    }
}


signed main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);
    int _ = 1;
//    cin >> _;
    while (_--) {
        solve();
    }
    return 0;
}

J.Rigged Games

题目大意 :给出一串01串表示接下来比赛中A队的输赢情况,此01串无限循环直至比赛结束,给出a,b表示赢a场小比赛算作赢一场大比赛,赢b场大比赛即算作赢下比赛,输出从给出01串的第i个字符开始比赛时第胜负情况。
思路 :用双指针遍历01串记录从i开始第一场大比赛结束时的结果和结束的位置,然后用倍增求出比赛结果

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 5e5 + 10;

vector<int> w(N);
vector<vector<vector<int> > > go(N, vector<vector<int> >(30, vector<int>(3)));

void solve() {
    int n, a, b;
    cin >> n >> a >> b;
    for (int i = 0; i < n; i++) {
        char num;
        cin >> num;
        w[i] = num - '0';
    }
    int j = 0;
    int ya = 0;
    int yb = 0;
    for (int i = 0; i < n; i++) {
        while (!(ya == a || yb == a)) {
            if (w[j] == 1) ya++;
            else yb++;
            j++;
            j %= n;
        }
        if (ya == a) go[i][0] = {j, 1, 0};
        else go[i][0] = {j, 0, 1};
        if (w[i] == 1) ya--;
        else yb--;
    }
//    for (int i = 0; i < n; i++)
//        //cout << i << ' ' << go[i][0][0] << ' ' << go[i][0][1] << ' ' << go[i][0][2] << ' ' << '\n';
    for (int i = 1; i <= 20; i++) {
        for (j = 0; j < n; j++) {
            if (go[j][i - 1][1] + go[go[j][i - 1][0]][i - 1][1] > b ||
                go[j][i - 1][2] + go[go[j][i - 1][0]][i - 1][2] > b ||
                go[j][i - 1][1] == 0 && go[j][i - 1][2] == 0 ||
                go[go[j][i - 1][0]][i - 1][1] == 0 && go[go[j][i - 1][0]][i - 1][2] == 0 ||
                go[j][i - 1][1] == b || go[go[j][i - 1][0]][i - 1][1] == b ||
                go[j][i - 1][2] == b || go[go[j][i - 1][0]][i - 1][2] == b)
                continue;
            go[j][i][0] = go[go[j][i - 1][0]][i - 1][0];
            go[j][i][1] = go[j][i - 1][1] + go[go[j][i - 1][0]][i - 1][1];
            go[j][i][2] = go[j][i - 1][2] + go[go[j][i - 1][0]][i - 1][2];
            //cout << j << ' ' << i << ' ' << go[j][i][0] << " " << go[j][i][1] << " " << go[j][i][2] << "\n";
        }
    }
    for (int i = 0; i < n; i++) {
        int idx = i;
        ya = 0;
        yb = 0;
        for (int k = 20; k >= 0; k--) {
            //cout << idx << ' '<<k <<'\n';
            if (go[idx][k][1] + go[idx][k][2] == 0) continue;
            int aa = ya + go[idx][k][1];
            int bb = yb + go[idx][k][2];
            //cout << aa <<'|'<< bb<<"|";
            if (aa > b || bb > b||aa>=b&&bb>=b) continue;
            if (aa == b || bb == b ) {
                if (aa == b) cout << 1;
                else cout << 0;
                break;
            }
            ya = aa;
            yb = bb;
            idx = go[idx][k][0];
        }
    }
}


signed main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);
    int _ = 1;
//    cin >> _;
    while (_--) {
        solve();
    }
    return 0;
}

标签:emplace,cout,int,++,多校,2024,牛客,vector,go
From: https://www.cnblogs.com/yoez123/p/18328147

相关文章

  • 2024最新一元云购源码.完美运营版.机器人自动下单.可指定中奖.一元购源码.一元夺宝源
    2024年最新云购源码一元云购H5新版本新UI 完美运行版•带易支付接口机器人自动购买•可指定中奖云购演示站:yun.6323g.com/ 源码下载链接:https://pan.baidu.com/s/1UsSE3IX_um_eAEcMIBLpHA?pwd=akjd 提取码:akjd  免责声明:该资源仅供学习和研究使用,一切关于该资源......
  • 组合数学学习笔记(一)(2024.7.3)
    一、组合数1.递推式$\displaystyle\binom{n}{m}=\displaystyle\binom{n-1}{m-1}+\displaystyle\binom{n-1}{m}$证:左边相当于从$n$个数中选$m$个数,右边枚举第$n$个数选不选。如果选,就从剩下$n-1$个数中选$m-1$个;如果不选,就从剩下$n-1$个数中选$m$个。2.对称性......
  • 2024暑假总结2
    7.22——数据结构上课+做题首先讲的是树剖。树剖核心就是根据树的一些特征(如深度、最大子树),将一棵树拆分成\(\log{n}\)个连续的树链,使得树上问题转化为线性问题,最后再用数据结构维护区间或是直接dp之类。由于我之前就比较熟悉树剖、还写过一些题,所以听得非常轻松,但是水平还......
  • ECCV 2024|是真看到了,还是以为自己看到了?多模态大模型对文本预训练知识的过度依赖该解
    随着大型语言模型(LLMs)的进步,多模态大型语言模型(MLLMs)迅速发展。它们使用预训练的视觉编码器处理图像,并将图像与文本信息一同作为Token嵌入输入至LLMs,从而扩展了模型处理图像输入的对话能力。这种能力的提升为自动驾驶和医疗助手等多种潜在应用领域带来了可能性。点击访问......
  • 布客社区未来规划 202407
    一、翻译这个月FreeLearning系列教程会完全发布完毕https://wizard.blog.csdn.net/下半年安排如下:8~9月:DSAI库源码解析10月:VKDoc11月:iBooker12月:杂项25.1~2月:GeekDoc25.3月之后:题库或者问答没错,为了博客能够持续更新,所有翻译结束后我们将搜集考试和竞赛题库,整理后发不......
  • Scratch作品-巴黎2024奥运会
    ​《Scratch作品-巴黎2024奥运会》是一款以巴黎2024年奥运会为主题的互动作品,专为儿童和青少年设计。通过Scratch编程语言,这个作品生动地再现了奥运会的精彩瞬间,结合了动画、声音和互动元素,让用户仿佛置身于巴黎的奥运赛场。玩家可以参与各种虚拟的奥运项目,学习奥运精神,了解各国......
  • 2024年第三届钉钉杯大学生大数据挑战赛初赛题目初赛B:医疗门诊患者及用药数据案例分析
    (着重更新B题,A题只更新一部分)持续更新中。。2024年第三届钉钉杯大学生大数据挑战赛初赛题目初赛B:医疗门诊患者及用药数据案例分析一、问题背景:智慧医疗的出现,主要是因为传统医疗存在管理系统的不完善、医疗成本高、渠道少、覆盖面低等问题,因此需要建立......
  • 2024年第二届国际高校数学建模竞赛 A题:金字塔石块的运输 Chatgpt-4 详细思路和代码
    目录问题一思路代码问题二思路代码优化数学建模问题三思路代码参数敏感性分析方法问题四思路代码最优运输模型建立实施建议问题一思路代码问题1:建立数学模型,收集相关数据,以最大的赫夫金字塔为例,计算在给定的运输车辆数量和载重量下,完成石料运输任务所需的最小......
  • 2024年第二届国际高校数学建模竞赛 B题:太空迁移计划与策略 Chatgpt-4 详细思路和代码
    目录问题一问题分析和建模模型建立算法设计Python代码实现解释代码实现问题二问题分析和建模模型建立算法设计Python代码实现解释代码实现问题三问题四问题2:重新考虑资源获取的工作分配问题问题3:重新考虑资源分配的优化问题总结问题一问题1:假设每艘飞......
  • 吃水果-小红书2024笔试(codefun2000)
    题目链接吃水果-小红书2024笔试(codefun2000)题目内容在一个遥远的星球上,这颗星球上的果树非常奇特,同一条直线上的果树只会长出不同种类的水果。有一天塔子哥乘飞船来到了这里,由于他的食物不多了,于是他决定在这颗星球上进行补给。他发现了一个n棵果树长成的直线,其中第......