笔试算法题分享

铁佛  金牌会员 | 2023-11-3 14:03:35 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

草船借箭

题目:
  1. 题目描述:
  2. 程序员小周同学这几天在看《三国演义》。今天他看到了“草船借箭”这一回,在钦佩诸葛亮巧借东风向曹操“借"箭的同
  3. 时,小周想到这么一个问题: 如果诸葛亮一共派出了N条放置草人的船来“借"箭。“悚慨”的曹操向第1条草船上射了A支
  4. 箭、第2条草船上射了B支箭,第3条草船上射的箭的数量等于前面两条船上箭的数量之和多一支,第4条草船上射的箭的
  5. 数量等于前面三条船上的箭的数量之和多一支,...,以此类推,第N条草船上箭的数量等于前面N-1条船上箭的数量之和
  6. 多一支。 下面问题来了,请问这一次诸葛亮一共从曹操那里“借”了多少支箭呢?
  7. 输入描述
  8. 输入三个正整数N、A和B,三个正整数都不超过1000,并且保证N>1,且两两之间用空格隔开。
  9. 输出描述
  10. 输出诸葛亮“借”箭的总数量。结果对1e9+7取模。
  11. 样例输入
  12. 4 1 2
  13. 样例输出
  14. 15
复制代码
思路:

  • 求出每条船上的箭头数量。由nums保存
​        a.当天箭头的数量是前面箭头数量和+1,由 preSum保存

  • 求出所有总和,即nums数组求和即可
如果写过斐波拉切数列那么本题思路就会比较明确。
[code]#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int main() {    long long mod = 1e9 + 7;    int n = -1; cin >> n;    vector nums(n,0);    cin >> nums[0] >> nums[1];    long long preSum = nums[0] + nums[1];    for (int i = 2; i < n; ++i) {        nums = (preSum + 1)%mod;        preSum += nums;        preSum %= mod;    }    long long res = 0;    for (int i = 0; i < nums.size(); ++i) {        res += nums;        res %= mod;    }    cout > m;    vector dp(n + 1, vector(m+10, INT_MAX/2));//dp[j]表示考虑前i个数字,组合为j的最小的数字个数    for (int i = 0; i < n + 1; ++i) {        dp[0] = 0;//任何组合组成0 需要的个数是0个    }    vector numsVt;    for (int i = 0; i < n; ++i) {        int t = -1; cin >> t;        numsVt.push_back(t);    }    for (int i = 1; i  m) { continue; }        dp[thisNum] = 1;  //特殊赋值                for (int j = 0; j = thisNum) {                dp[j] = min({dp[j],dp[i - 1][j - thisNum] + 1 });            }        }    }    if (dp[n][m] == INT_MAX / 2) {        cout
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表