首页 > 编程语言 >笔试算法题分享

笔试算法题分享

时间:2023-10-16 20:45:49浏览次数:39  
标签:include nums int 笔试 个数 long 算法 分享 dp

草船借箭

题目:

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

思路:

  1. 求出每条船上的箭头数量。由nums保存

​ a.当天箭头的数量是前面箭头数量和+1,由 preSum保存

  1. 求出所有总和,即nums数组求和即可

如果写过斐波拉切数列那么本题思路就会比较明确。


#include <cmath>
#include <vector>
#include <stdint.h>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <numeric>
#include <algorithm>
#include <iostream>
#include <climits>
#include <deque>
#include <bitset>
#include <functional>
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include <stack>
#include <queue>
using namespace std; 

int main() {
    long long mod = 1e9 + 7;
    int n = -1; cin >> n;
    vector<int> nums(n,0);
    cin >> nums[0] >> nums[1];
    long long preSum = nums[0] + nums[1];
    for (int i = 2; i < n; ++i) {
        nums[i] = (preSum + 1)%mod;
        preSum += nums[i];
        preSum %= mod;
    }
    long long res = 0;
    for (int i = 0; i < nums.size(); ++i) {
        res += nums[i];
        res %= mod;
    }
    cout << res << endl;
    return 0;
}

随机数选最少数字求和

本题也可见https://blog.csdn.net/qq_43522889/article/details/132460220,但是个人觉得有些链接中写的思路有问题。

题目:

小明用计算机随机生成了N个正整数,他希望从这N个数中选取若干个数,使得它们的和等于M。这些随机生成的数字可能会相同,但是每个数字最多只允许使用一次。
当然这样的选取方案可能不存在,也可能有多个。
现在希望编写一个程序,能够找出数字个数最少的选取方案,输出对应的最少数字的个数,如果无解输出“No solution”。
输入描述:

单组输入,每组入2行。
第1行包含两个正整数N和M,分别表示初始输入的正整数个数和目标数字和(N<=1e3,M<=1e5)。
第2行为N个正整数,两两之间用空格隔开(每一个正整数均小于等于1e5)。
输出描述:

输出数字个数最少的选取方案中所包含的最少数字个数,如果无解输出“No solution”。
样例:

输入
5 5
1 3 2 1 1
输出
2

思路:

只需要输出最后的个数,因此大概率是dp。

dp三要素:

​ dp含义:dp[i][j]表示考虑前i个数字的情况下,组合成j的最少数字个数。

​ 属性:最小值,最少数字个数。

​ 状态转移方程:

dp[i][j] = min({ dp[i][j], dp[i - 1][j] });
if (j >= thisNum) {
dp[i][j] = min({dp[i][j],dp[i - 1][j - thisNum] + 1 });
}

代码:



#include <cmath>
#include <vector>
#include <stdint.h>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <numeric>
#include <algorithm>
#include <iostream>
#include <climits>
#include <deque>
#include <bitset>
#include <functional>
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include <stack>
#include <queue>
using namespace std; 

int main() {
    int n, m; cin >> n >> m;
    vector<vector<int>> dp(n + 1, vector<int>(m+10, INT_MAX/2));//dp[i][j]表示考虑前i个数字,组合为j的最小的数字个数
    for (int i = 0; i < n + 1; ++i) {
        dp[i][0] = 0;//任何组合组成0 需要的个数是0个
    }
    vector<int> numsVt;
    for (int i = 0; i < n; ++i) {
        int t = -1; cin >> t;
        numsVt.push_back(t);
    }
    for (int i = 1; i <= n; ++i) {
        int thisNum = numsVt[i - 1];
        if (thisNum > m) { continue; }
        dp[i][thisNum] = 1;  //特殊赋值
        
        for (int j = 0; j <= m; ++j) {
            dp[i][j] = min({ dp[i][j], dp[i - 1][j] });
            if (j >= thisNum) {
                dp[i][j] = min({dp[i][j],dp[i - 1][j - thisNum] + 1 });
            }

        }
    }
    if (dp[n][m] == INT_MAX / 2) {
        cout << "No solution" << endl;
    }
    else
    {
        cout << dp[n][m] << endl;
    }
    return 0;
}

我的博客园:https://www.cnblogs.com/swx123
我的github(代码一般都放在这里):https://github.com/578223592

标签:include,nums,int,笔试,个数,long,算法,分享,dp
From: https://www.cnblogs.com/swx123/p/17768294.html

相关文章

  • 算法·数学
    数学:证明方法:反证法,双向证明法质因数约数:试除法约数个数(a1+1)(a2+1)...(an+1)=\(\prod_1^{约数个数}(a_i+1)\)约数之和(p1^0+p1^1+...+p1^a1)...=\(\prod_1^{约数个数}\sum_{i=0}^{每个约数重复次数a_i}(b^i)\)gcd最大公约数——辗转相除法(欧几里得算法)证......
  • 文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题
    七、用go语言,给出一个O(n)时间的非递归过程,实现对一个含n个元素的单链表的逆转。要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间。文心一言:在Go语言中,你可以使用迭代方法来反转一个单链表。这种方法只需要O(1)的额外空间。首先,我们需要定义链表的数据结构:t......
  • 文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题
    七、用go语言,给出一个O(n)时间的非递归过程,实现对一个含n个元素的单链表的逆转。要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间。文心一言:在Go语言中,你可以使用迭代方法来反转一个单链表。这种方法只需要O(1)的额外空间。首先,我们需要定义链表的数据结构:type......
  • 计算机网络的分组转发算法例题解析
    例题展示例题解决将题目中要求的ip地址与相对应的子网掩码进行二进制上面的相与即可,若是与目的ip地址一致,那么就直接跳转到其对应的那个接口;否则就直接跳转到默认接口;本题答案为R2;......
  • 数据结构与算法 | 数组(Array)
    数组(Array)数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中。每个元素都有一个唯一的索引,可以用于访问该元素。 //java数组示例 int[]numbers1={2,0,2,3,9,23}; //或者 int[]numbers2=newint[6];基本概念数组基......
  • 小程序分享pdf文件(uniapp)
    share(){wx.downloadFile({url:'',//下载urlsuccess(res){//下载完成后转发wx.shareFileMessage({filePath:res.tempFilePath,suc......
  • 基于X86六轮差速移动机器人运动控制器设计与实现(二)规划控制算法
    带输入约束的MPC路径跟踪控制MPC算法是一种基于控制对象模型的控制方法,其优势在于在控制中考虑了系统的多种物理约束,同时基于模型与当前机器人的反馈信息预估出未来机器人位姿信息的处理方法可以解决控制迟滞的问题。4.1MPC路径跟踪控制器框架根据第......
  • 分布式一致性算法Raft
    raft算法之所以容易理解,其一是他将一致性问题划分成几个子问题,这几个子问题都是独立、可理解和解释的。从传统的思维来讲,对于一个复杂的系统或者工程,都是大化小,分解实现,然后去尝试融合解决整体逻辑。一、Raft详解Raft算法是分布式系统开发首选的共识算法。比如现在流行Etcd、Con......
  • Adobe2024全家桶大更新, 包含Win/Mac M1 M2 ,安装教程分享
    按照以往的惯例每年的10月份下旬将会迎来Adobe一年一度的软件大更新,大家期待已久的Adobe2024全家桶终于来了,这次可以说是不痛不痒的大更新,喜欢尝鲜的小伙伴赶紧安排上!Adobe2024全套更新最新Adobe2024全集桶,拥有更强大的内容,更完善的功能,更全面的软件,给你带来全新不一样的体......
  • 【触想智能】Windows 工控一体机系统选择知识分享
    工控一体机按系统可以分为安卓工控一体机和Windows工控一体机两种,而Windows工控一体机一般都支持win7、win8、Win10等系统。支持工控一体机的操作系统很多,拿Win10举例,版本众多,包含精简版、家庭版、专业版、企业版等系统。从功能体验来看,Win10专业版和企业版无疑是最完善......