首页 > 其他分享 >【每日一题】Problem 234C. Weather

【每日一题】Problem 234C. Weather

时间:2023-06-22 17:00:43浏览次数:44  
标签:std vector int 元素 Weather 234C Problem txt dp

原题

解决思路

  • 还是先从二维数组开始,定义一个二维数组\(dp\),对于 \(dp[i,j]\),\(i\) 表示第 \(i\) 个元素,\(j\) 表示当前元素的状态(正数或负数)
    \(dp[i,0]\) 表示第 \(i\) 个元素为负数时,前 \(i\) 个元素中需要改动的元素数;
    \(dp[i,1]\) 表示第 \(i\) 个元素为正数时,前 \(i\) 个元素中需要改动的元素数
#include <bits/stdc++.h>

int main() {
    std::freopen("input.txt", "r", stdin);
    std::freopen("output.txt", "w", stdout);

    int n;
    std::cin >> n;
    std::vector<int> t(n + 1, 0);
    for (int i = 1; i <= n; ++i) std::cin >> t[i];

    std::vector<std::vector<int>> dp(n + 1, std::vector<int>(2, 0));
    if (t[1] == 0) ++dp[1][0], dp[1][1] = n+1;
    else if (t[1] < 0) dp[1][1] = n+1;
    else dp[1][0] = 1, dp[1][1] = n+1;
    for (int i = 2; i <= n; ++i) {
        if (t[i] < 0) {
            dp[i][0] = dp[i - 1][0];
            dp[i][1] = std::min(dp[i - 1][0], dp[i - 1][1]) + 1;
        } else if (t[i] == 0) {
            dp[i][0] = dp[i - 1][0] + 1;
            dp[i][1] = std::min(dp[i - 1][0], dp[i - 1][1]) + 1;
        } else {
            dp[i][0] = dp[i - 1][0] + 1;
            dp[i][1] = std::min(dp[i - 1][0], dp[i - 1][1]);
        }
    }
    std::cout << dp[n][1] << std::endl;

    return 0;
}
误区

按照题目要求,正数和负数都必须有非零个。因此,需要实现时需要满足两个条件

  1. 第一个元素必须是负数
    • 对于 \(dp[1][1]\),将其设置为 \(n+1\),表示不可达(在后续代码中可以发现,任何涉及到 \(dp[i-1][1]\) 的都在 \(min\) 函数中)
  2. 最后一个元素必须是正数
    • 输出 \(dp[n][1]\) 即可

更好的解

同样地,在二维数组的基础上,优化一下判断以及将其转换成一维数组

#include <bits/stdc++.h>

int main() {
    std::freopen("input.txt", "r", stdin);
    std::freopen("output.txt", "w", stdout);

    int n;
    std::cin >> n;
    std::vector<int> t(n + 1, 0);
    for (int i = 1; i <= n; ++i) std::cin >> t[i];

    std::vector<int> dp(2, 0);
    if (t[1] >= 0) dp[0] = 1;
    dp[1] = n + 1;
    for (int i = 2; i <= n; ++i) {
        // dp[1] 必须先于 dp[0] 更新,因为 dp[1] 依赖于未更新的 dp[0]
        dp[1] = std::min(dp[0], dp[1]);
        if (t[i] <= 0) dp[1] += 1;
        if (t[i] >= 0) ++dp[0];
    }

    std::cout << dp[1] << std::endl;
    return 0;
}

标签:std,vector,int,元素,Weather,234C,Problem,txt,dp
From: https://www.cnblogs.com/HelloEricy/p/17488537.html

相关文章

  • 每日一题力扣 1262 https://leetcode.cn/problems/greatest-sum-divisible-by-three/
    、 题解这道题目核心就算是要知道如果x%3=2的话,应该要去拿%3=1的数字,这样子才能满足%3=0贪心sum不够%3的时候,就减去余数为1的或者余数为2的需要注意两个余数为1会变成余数为2的,所以可能减去2个余数为1核心代码如下publicintmaxSumDivThreeOther(int[]nums){​  ......
  • Yet Another Minimization Problem(CF1637D)
    \(\text{Des}\)Youaregiventwoarrays$a$and$b$,bothoflength$n$.Youcanperformthefollowingoperationanynumberoftimes(possiblyzero):selectanindex$i$($1\leqi\leqn$)andswap$a_i$and$b_i$.Let'sdefi......
  • 登陆服务器异常ABRT has detected 1 problem(s).
    1、登陆服务器后,出现如下所示错误:ABRThasdetected1problem(s).Formoreinforun:abrt-clilist--since16862382592、执行提示命令[root@hadoop1~]#abrt-clilist--since16862382593、启用自动报告功能[root@hadoop1~]#abrt-auto-reportingenabled4、重新链接测试,没......
  • HDU5293 Tree chain problem
    HDU5293TreechainproblemSolution1考虑dp。把链的信息挂在深度最浅的节点上,自下而上更新答案。记\(f_u\)表示\(u\)子树内的最大权值和,\(S\)表示挂在\(u\)上的某条链,\(son(x)\)表示点\(x\)的儿子集合,\(T_u\)表示子树\(u\)的点集。则\(f_u\)的初始值为:\[f_......
  • 【每日一题】Problem 180C. Letter
    原题解决思路每一个字符以前一个字符为基准,来判断自己是upper还是lower,从而找到最少的解最开始的解决思路是,用回溯的方式来解决,即使划分区块该方法也十分耗时,因为每个字符都有两种情况,因此时间复杂度为\(O(2^n)\)将\(1\)的方式修改下,分别用\(num[i][0],num[i][1]\)来......
  • 【每日一题】Problem 174B. File List
    原题解决思路纯模拟,比较文件名长度是否合规,文件格式+下一个文件名长度是否合规误区文件名的长度要和文件格式+下一个文件名的长度分开判断更新左端点和每次迭代开始先判断的方式解决该问题最后一个'.'后的文件格式需要特殊处理在循环结束后与'.'不存在的情况共同......
  • unbounded knapsack problem
    DescriptionUnboundedKnapsackProblemThereare$N$kindsofitemsandaknapsackwiththecapacityof$V$,eachitemhasunlimitedpiecesavailable.Thevolumeofthe$i$-thitemis$v_i$,andvalueis$w_i$.Pleasesolvewhichitemscanbeputintothe......
  • 5、题目:Training in Creative Problem Solving: Effects on Ideation and Problem Fin
    期刊信息(1)作者:GeorgeB.Graen,StephenG.Graen(2)期刊:OrganizationalBehaviorandHumanPerformance(3)DOI:10.1016/0030-5073(82)90233-1(4)ISSN:0030-5073   研究背景创造力训练作为工业培训的一个子集,普遍面临着工业培训研究的许多问题,也面临着一些独特的问题。......
  • 【每日一题】Problem 120F. Spiders
    原题解决思路通过给定的数据,将其构建称树,取其中最大的深度进行拼接,最后得到最终结果如何获取最大的深度以每个节点作为root构建树,然后取其中最大的深度#include<bits/stdc++.h>/***@paramvec*@paramcur当前节点*@paramlast上一个访问的节点*@param......
  • RTFM、STFW 和 X-Y Problem
    如何提问艾瑞克。史蒂文.雷蒙德(EricStevenRaymond)的提问的智慧。这是一篇长文,看完需要十几分钟的时间。如果之前没有认真看过并且思考过,这十几分钟会改变你的职业生涯。这文章可能会出现一些让人不适的词语或者过时的例子,但我认为这不会影响它要表达的内容,而你需要好好琢磨作......