豆包MarsCode AI 刷题

84 阅读2分钟

11.6 贪心猫分鱼干

思路

正着遍历,再反着遍历

代码语法(cpp)

1.创建一个长度为n的数组,并初始化为1: vector<int> a(n,1)

难点

想不到这个思路

11.10 创意标题匹配

思路

还没看正解 但我的第一反应的解法要考虑不少细节:

  • 如下面语法提到的,是+=还是=,要不要+1,是count还是index?
  • 末尾,不是{}时要用rfind(分类讨论)
  • 什么条件才是true?

语法

  1. for (auto title : titles) 遍历
  2. i+=templateStr.substr(i).find('}')+1;
  • i=templateStr.substr(i).find('}')+1;错
  • substr(i)从位置i开始,取到末尾
  • 此时find到的是截取后的第k个
  1. countj=title.substr(j).find(templateStr.substr(i,count));
  • substr(i,count) // 从位置 i 开始,取 count 个字符

其余易错

  1. while套while,break了但没完全break(有什么更好的办法解决吗?)
  2. 重复加false:提前发现false,直接给ans+false再break;但在break后还有个+false/true的地方

11.11 徒步旅行的补给问题

思路

  1. 循环(最初始的思路,复杂)
  2. dp
  3. 做这题时总是会想到最小栈,,然后就没往dp想

语法

创建二维数组dp:
  1. vector<vector<int>> dp(n+1, vector<int>(k+1, INT_MAX))
  2. 括号和参数
  3. INT_MAX

难点

dp
  1. dp[i][j]:第i天携带j份食物所需的最少钱
  2. 状态转移:
  • 错: dp[i][j]=min(dp[i-d][j-m]+data[i-d]*m)
  • 对: dp[i][j]=min(dp[i-1][j-m+1]+data[i-1]*m)
  • 因为: d>1重复dp了,已经在d=1里更新了
  • 以及: 每天会消耗1,所以对标的是[j-m+1],
  • m的含义:前一天买m份
  • dp[i-1][j-m+1]:前一天买m份前已经花了多少
  1. 状态初始:
  • 错: dp[0][t]=t*data[0]
  • 对: dp[0][0]=0,其余INT_MAX
  • 为什么只用[0][0]: 每次是在第二天的dp算上前一天的购买,所以第0天只需记实,在第二天会补的
  1. 状态结束: dp[n][0]
  2. 循环的i,j,m:
  • j小于k: 因为dp[i]为第(i+1)天购买和消耗前,第i天购买和消耗后(i等于0时为第1天购买和消耗前),所以不可能达到k(这里很奇怪,题目没说清?我的理解同一天是先买再消耗)
  • dp[i][j]=min(dp[i-1][j-m+1]+data[i-1]*m)
  • 0<=j-m+1<=k && 0<=m<=k
  • => max(j+1-k,0)<=m<=min(k,j+1)

11.12 找出整型数组中占比超过一半的数

思路

  • 我在力扣做过,所以直接写出来了
  • 假定一个为候选者,记录它的票数和反对票,反对票超了就换人
  • 为什么可行:换人后可能还会换回来的

易错

初始化

if(b>a){
            ans=t;
            a=0;
            b=0;
        }

当换人,票数要清零