IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Codeforces Round #765 (Div. 2) (A-C)题解 -> 正文阅读

[C++知识库]Codeforces Round #765 (Div. 2) (A-C)题解

更好的阅读体验:http://www.abmcar.top/archives/codeforcesround765div2

完整代码:https://github.com/abmcar/ACM/tree/master/OpenjudgeNow/Codeforces/Codeforces%20Round%20%23765%20(Div.%202)

A. Ancient Civilization

在这里插入图片描述
题目大意:
给你n个二进制下长度小于k的数,让你求一个数,使它和其余数的二进制上的不同的个数最少
思路:
一道不怎么简单的A题,统计所有数每一位的个数,判断某一位的0多还是1多来构造答案
代码:

string intToString(int x)
{
    string ans = "";
    while (x)
    {
        ans = ans + (char)(x % 2 + '0');
        x = x / 2;
    }
    return ans;
}

void work()
{
    cin >> n >> m;
    map<int, int> M;
    for (int i = 1; i <= n; i++)
    {
        int temp;
        cin >> temp;
        string nowString;
        nowString = intToString(temp);
        for (int j = 0; j < nowString.size(); j++)
            if (nowString[j] == '1')
                M[j]++;
    }
    ll nowNum = 0;
    for (int i = 0; i < m; i++)
        if (M[i] * 2 > n)
            nowNum += (1 << i);
    cout << nowNum << endl;
}

B. Elementary Particles

在这里插入图片描述
题目大意:给你一个长度为n的数组,让你求两个最长的子区间使得其中有一位相同
思路:
从相同的位入手,我们发现如果要使得子区间长度最长,那这两个区间应该是尽可能重叠的,也就是说他们再相同的哪一位上是相邻的,比如相同位的数是1,那么这两个1中间没有另一个1,否则我们可以构造出一个更长的子区间,因此,我们记录所有相同的数出现的位置遍历找最长,时间复杂度On
代码:

void work()
{
    cin >> n;
    vector<int> nums(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> nums[i];
    map<int, vector<int>> M;
    for (int i = 1; i <= n; i++)
        M[nums[i]].push_back(i);
    int ans = 0;
    for (auto it : M)
    {
        for (int j = 0; j + 1 < it.second.size(); j++)
        {
            int nowPos = it.second[j] + 1;
            int nextPos = it.second[j + 1] + 1;
            ans = max(ans, min(nowPos, nextPos) + min(n - nowPos, n - nextPos));
        }
    }
    if (ans == 0)
        ans = -1;
    cout << ans << endl;
}

C. Road Optimization

在这里插入图片描述

在这里插入图片描述
题目大意:
给你一段路,路上有n个路牌限速,限速后每公里要花ai分钟,给你这段路的总长度m,以及你可以去掉k个路牌,问最小通过这段路的时间
思路:
简化一下模型,想不想一个取个不去的01背包,只是这个问题里还有当前速度这个因素,有点像那种分层图,
因此我们用dp[i][j][k]表示在第i个路牌已经去掉j个限速时当前速度为k的最小花费时间
i j的范围都是500,而k我们知道虽然可能很大,但实际非常少,因此我们用map来保存
对于每一个状态dp[i][j][k],它可以转移到dp[i+1][j][k],这种情况下不去掉这个路牌
如果当前限速比新路牌小,我们可以选择去掉路牌,转移到dp[i+1][j+1][v[i]]
值得注意的是这种写法需要给定一个初值,
而且最后也要判断一下最后的一段距离
代码:

int n, m, k;
vector<int> d, v;
map<int, int> dp[616][616];

signed main()
{
    Buff;
#ifdef Debug
    freopen("temp.in", "r", stdin);
    freopen("temp.out", "w", stdout);
#endif
    cin >> n >> m >> k;
    d.resize(n + 2);
    v.resize(n + 2);
    for (int i = 1; i <= n; i++)
        cin >> d[i];
    for (int i = 1; i <= n; i++)
        cin >> v[i];
    dp[1][0][v[1]] = 0;
    for (int i = 2; i <= n; i++)
    {
        for (int j = 0; j <= k; j++)
        {
            for (auto it : dp[i - 1][j])
            {
                dp[i][j][v[i]] = min(dp[i][j][v[i]], dp[i - 1][j][it.first] + it.first * (d[i] - d[i - 1]));
                if (dp[i][j][v[i]] == 0)
                    dp[i][j][v[i]] = dp[i - 1][j][it.first] + it.first * (d[i] - d[i - 1]);
                if (it.first < v[i])
                {
                    dp[i][j + 1][it.first] = min(dp[i][j + 1][it.first], dp[i - 1][j][it.first] + it.first * (d[i] - d[i - 1]));
                    if (dp[i][j + 1][it.first] == 0)
                        dp[i][j + 1][it.first] = dp[i - 1][j][it.first] + it.first * (d[i] - d[i - 1]);
                }
            }
        }
    }
    int ans = 1e12;
    for (int j = 0; j <= k; j++)
        for (auto it : dp[n][j])
        {
            // cout << j << " " << it.first << " " << it.second << endl;
            ans = min(ans, it.second + it.first * (m - d[n]));
        }
    cout << ans << endl;
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:47:11  更:2022-01-14 01:48:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:45:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码