首页 > 其他分享 >[ABC306] C/D 题解

[ABC306] C/D 题解

时间:2023-07-01 17:03:54浏览次数:42  
标签:道菜 int 题解 ABC306 高桥 舒适 感到 dp

C.Centers

 参考算法

统计,排序

\(\rm Syx\) 给你 \(3 \times N\) 个数,其中 \(\rm Syx\) 可以保证:\(1 \sim N\) 之间的所有数都出现了 \(3\) 次,请你将 \(1 \sim N\) 之间的数每个出现在第 \(2\) 个位置的下标进行排序,并从小到大输出原数

用 \(\rm map\) 记录数出现的次数,当一个数第二次出现时(当 \(\rm map[x]=2\) 时)把 \(x\) 和下标 \(i\) 加入答案,最后按 \(i\) 排序,输出 \(x\)。

 参考代码
#include <bits/stdc++.h>
#define int long long

using namespace std;

using PII = pair<int, int>;

int n;
vector<PII> pos;
map<int, int> m;

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    for (int i = 1, x; i <= n * 3; i++) {
        cin >> x;
        m[x]++;
        if (m[x] == 2) {
            pos.push_back(make_pair(x, i));
        }
    }
    sort(pos.begin(), pos.end(), [&](PII a, PII b) {
        return a.second < b.second;
    });
    for (auto &i : pos) {
        cout << i.first << ' ';
    }

    return 0;
}

D.Poisonous Full-Course

 参考算法

动态规划,线性 \(\rm dp\)

高桥君决定去一家诡异的饭店,享用包含 $ N $ 道菜的套餐。每道菜有两个属性 $ X, Y $,含义如下:

  • $ X_i = 0 $ 表示第 $ i $ 道菜有解毒功效
  • $ X_i = 1 $ 表示第 $ i $ 道菜有毒
  • $ Y_i $ 表示第 $ i $ 道菜的美味程度

高桥君每品尝一道菜,他的身体状况就会发生如下的变化:

  • 起初,高桥君感到舒适
  • 当他感到舒适之时,
    • 如果他吃了一道有解毒功效的菜,他依然会感到舒适
    • 如果他吃了一道有毒的菜,他就会感到不适
  • 当他感到不适之时,
    • 如果他吃了一道有解毒功效的菜,他就然会感到舒适
    • 如果他吃了一道有毒的菜,他就会当场去世

菜是一道一道上的,对于第 $ i $ 道菜,用餐流程如下:

  • 首先,上菜。
  • 然后,高桥君可以选择品尝或选择跳过这道菜。
    • 如果他选择品尝这道菜,他的身体状况就会随着前文提及的规则改变。
    • 如果他选择跳过这道菜,这道菜不会留在餐桌上,之后也不会再上这道菜(即再也吃不到这道菜)。
  • 在做出上述选择后,如果高桥君还活着,
    • 如果 $ i \neq N $,上第 $ i + 1 $ 道菜,继续上述流程。
    • 如果 $ i = N $,高桥君就可以活着走出饭店。

高桥君还有一个重要的会议要开,所以他必须活着走出饭店。

现在,请你求出高桥君所品尝的菜肴的美味程度之和的最大值(如果他什么也不吃,我们认为答案为 $ 0 $)。

注意题目中 \(1\) 表示有毒。

这是一道动态规划的题,我们用 \(dp[i][0/1]\) 表示高桥君吃完第 \(i\) 道菜后 舒适/不适 的最大值。

当 \(X=0\):

  • 舒适:

    • \(1.\) 高桥君感到舒适,跳过了这道菜
    • \(2.\) 高桥君感到不适,跳过了这道菜
    • \(3.\) 高桥君感到舒适,品尝了这道菜
    • \(4.\) 高桥君感到不适,品尝了这道菜

    其中 \(2\) 没有感到舒适,舍去。
    状态转移方程为 \(dp[i][0]=\max \ \{dp[i-1][0], \ dp[i-1][0]+Y, \ dp[i-1][1]+Y \}\)

  • 不适:

    显然是 $dp[i][1]=dp[i-1][1] $。

当 \(X=1\):

  • 舒适:

    显然是 $dp[i][0]=dp[i-1][0] $。

  • 不适:

    • \(1.\) 高桥君感到舒适,跳过了这道菜
    • \(2.\) 高桥君感到不适,跳过了这道菜
    • \(3.\) 高桥君感到舒适,品尝了这道菜
    • \(4.\) 高桥君感到不适,品尝了这道菜

    其中 \(1\) 和 \(4\) 没有感到不适,舍去。
    状态转移方程为 $dp[i][1]=\max \ {dp[i-1][1],dp[i-1][0]+Y } $

目标:\(\max \ \{dp[N][0],dp[N][1] \}\)

 参考代码 $1$
#include <bits/stdc++.h>
#define int long long

using namespace std;

int n;
int dp[300005][2];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    int X, Y;
    for (int i = 1; i <= n; i++) {
        cin >> X >> Y;
        if (!X) {
            dp[i][0] = max({dp[i - 1][0], dp[i - 1][0] + Y, dp[i - 1][1] + Y});
            dp[i][1] = dp[i - 1][1];
        } else {
            dp[i][0] = dp[i - 1][0];
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + Y);
        }
    }
    cout << max(dp[n][0], dp[n][1]) << '\n';

    return 0;
}
 参考代码 $2$
#include <bits/stdc++.h>
#define int long long

using namespace std;

int n;
int dp[2];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    int X, Y;
    for (int i = 1; i <= n; i++) {
        cin >> X >> Y;
        if (!X) {
            dp[0] = max({dp[0], dp[0] + Y, dp[1] + Y});
        } else {
            dp[1] = max(dp[1], dp[0] + Y);
        }
    }
    cout << max(dp[0], dp[1]) << '\n';

    return 0;
}

标签:道菜,int,题解,ABC306,高桥,舒适,感到,dp
From: https://www.cnblogs.com/vistral/p/abc306-c-d-ti-jie.html

相关文章

  • 【题解】#119. 最大整数 题解(2023-07-01更新)
    #119.最大整数题解题目传送门更新日志2023-05-2617:20文章完成2023-05-3015:22文章审核通过2023-07-0116:04修改了代码题目知识点字符串+贪心题意说明设有n个正整数($n<20$),将它们连接成一排,组成一个最大的多位整数。(题目简介明了,一看就是出题人懒得写题目背景)......
  • 【题解】P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    P8679[蓝桥杯2019省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-2521:02文章完成2023-05-2711:34文章通过审核2023-06-2021:03优化了文章代码格式试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,......
  • 【题解】P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    P8741[蓝桥杯2021省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-0923:19文章完成2023-05-0923:20通过审核2023-06-2021:03优化了文章代码格式试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能......
  • 【题解】P8684 [蓝桥杯 2019 省 B] 灵能传输 题解
    P8684[蓝桥杯2019省B]灵能传输题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-06-2021:46文章完成【解析】本题涉及到了$3$种算法:前缀和,排序以及贪心(1)前缀和本题实际上要求通过某种灵能传输可以使得该序列的最大值最小。而由前缀和可知,当某一个前......
  • 【置顶】FZQOJ题解集(2023-07-01更新)
    #68.「NOIP2004」津津的储蓄计划题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-02-0117:20文章完成2023-02-0316:09文章审核通过2023-02-0422:15修改了注释2023-05-2709:27修改了$\LaTeX$2023-07-0115:45修改了代码题目知识点模拟题目分析......
  • 【置顶】luogu题解集(2023-07-01更新)
    P8679[蓝桥杯2019省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-2521:02文章完成2023-05-2711:34文章通过审核2023-06-2021:03优化了文章代码格式试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,......
  • 【题解】#373. 「USACO1.1」Friday the Thirteenth 题解(2023-07-01更新)
    #373.「USACO1.1」FridaytheThirteenth题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-02-0117:20文章完成2023-02-0318:50文章审核通过2023-02-0319:17修改了注释2023-05-2520:25修改了$\LaTeX$2023-05-2520:32再次修改了$\LaTeX$,感谢ACRU......
  • 【题解】#105. 「USACO1.3」Ski Course Design 题解(2023-07-01更新)
    #105.「USACO1.3」SkiCourseDesign题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-02-0117:20文章完成2023-02-0316:09文章审核通过2023-02-0422:15修改了注释2023-05-1621:44修改了$\LaTeX$2023-07-0115:59修改了代码题目知识点模拟+搜索......
  • 【题解】#68. 「NOIP2004」津津的储蓄计划 题解(2023-07-01更新)
    #68.「NOIP2004」津津的储蓄计划题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-02-0117:20文章完成2023-02-0316:09文章审核通过2023-02-0422:15修改了注释2023-05-2709:27修改了$\LaTeX$2023-07-0115:45修改了代码题目知识点模拟题目分析......
  • CF1753 题解
    CF1753题解A首先我们发现,我们可以将序列一部分取反,将1变-1,-1变1的操作每次将总和增加2,所以如果初始和的绝对值为奇数则无解。我们发现,一段区间可以拆成若干个长度为2和1的小区间(+-+-+-+-....)变成(+-+-+-...)。我们假设初始都是长度为1的小区间,这时答案等于所有数的总和。我们......