2022-6-4 小明爱上课,切木头,最多分成多少块,躲猫猫,争渡
1. 小明爱上课 [动态规划]
小明非常喜欢上课,现在小明的课表有一些课,他可以通过课表选择上哪些课。
上课会有奖励,每门课上课时间长短不同奖励也会不一样,存在上课时间更长,奖励更少的情况。每一门课上课的总时长为整数。不同时长的奖励,题目数据中会给出。
对于每一门课,小明只可以上一次,现在小明一共有m分钟的时间可以安排上课,但是小明想要得到最大的奖励,聪明的你可以帮助小明解决这个问题吗?
输入
第一行,输入两个数n和m,表示课程的数目以及小明需要上课的时间 接下来包括n行,每行m个数,第i个数表示对于每门课上i分钟的奖励 (i从1开始,每门课程只可以上一次)
对于10%的数据,1<= n<= 4,1<=m<=4
对于50%的数据,1<= n<= 100,1<=m<=100
对于100%的数据,1<= n<=100,1<=m<=100
1<=奖励值<=1000
输出
输出一个数,表示最大的奖励值。
输入样例
2 3
3 2 1
3 2 1
输出样例
6
代码
#include<bits/stdc++.h>
using namespace std;int n, m, dp[105][105], credit[105][105];int main() {cin >> n >> m;for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)cin >> credit[i][j];for (int i = 1; i <= n; ++i) { // 课程 ifor (int s = 1; s <= m; ++s) {dp[i][s] = dp[i - 1][s]; // 不上课程 ifor (int j = 1; j <= s; ++j) {dp[i][s] = max(dp[i][s], credit[i][j] + dp[i - 1][s - j]);}}}cout << dp[n][m];return 0;
}
2. 切木头 [二分]
有n
个木棍,长度不等,现在要将他们切成同等长度的木棍m
个,并且每段的长度都为整数。问这m根木棍最长能有多长?
输入
第一行2个数:n, m中间用空格分隔(1 <= n <= 100000, 1 <= m <= 10^9)
后面n行:每行1个数,对应木棍的长度(1 <= Li <= 10^9)。
输出
输出一个整数,对应木棍的长度。
输入样例
3 10
15
25
12
输出样例
5
代码
#include<bits/stdc++.h>
using namespace std;int n, m, nums[100005];bool check(int x) {int ans = 0;for (int i = 0; i < n; ++i) ans += (nums[i] / x);return ans >= m;
}int main() {cin >> n >> m;for (int i = 0; i < n; ++i) cin >> nums[i];int lo = 1, hi = 1000000005;while (lo < hi) {int mi = lo + ((hi - lo) >> 1);check(mi) ? lo = mi + 1 : hi = mi;}cout << --lo;return 0;
}
3. 最多分成多少块 [贪心]
然而小b很懒,她觉得对整个数组排序太累了,因此她请你将a分成一些块,使得她只需要对每一块分别排序,就能将整个数组排序。
将a分成2块或者更多块,都无法得到所需的结果。
例如,分成 [4, 3], [2, 1, 0] ,排序得到的结果是 [3, 4, 0, 1, 2],这不是有序的数组。
输入
第一行一个数n;
第二行n个数表示a[i],以空格隔开。
n<=10
输出
输出一个数表示划分块的数量
输入样例
5
4 3 2 1 0
输出样例
5
代码
#include<bits/stdc++.h>using namespace std;int n, nums[100005];int main() {cin >> n;for (int i = 0; i < n; ++i) cin >> nums[i];int ans = 0;for (int i = 0, maxNumber = -1; i < n; ++i) {maxNumber = max(maxNumber, nums[i]);if (maxNumber == i) ans++;}cout << ans;return 0;
}
4. 躲猫猫 [DFS]
在一个8*8
的二维平面内,你初始时刻处于M
点,每一个移动轮次你可以向8联通的方向走1
格,也可以呆在原地保持不动。你需要移动到逃生点A
,并且安全待到你的下一移动轮次才能逃生。
问最终你能否从M
点移动到A
点逃生。可以的话输出Win
,否则输出Lost
。
输入
输入共8行,每行的字符包括'A' 'M' 'S' '.',其中M表示起始位置,A表示终点位置,S表示猫,.表示空地,可以随便走。
输出
输出共1行,如果可以从M点移动到A点。输出Win,否则输出Lost。
输入样例
.......A
........
........
........
........
........
SS......
M.......
输出样例
Lost
代码
#include<bits/stdc++.h>using namespace std;const vector<pair<int, int>> DIR{{0, 0}, {0, 1}, {0, -1}, {1, 0}, {-1, 0},{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
int xt, yt;
bool isCat[8][8];bool dfs(int xi, int yi, int time) {if (xi < 0 || yi < 0 || xi == 8 || yi == 8) return false; // 边界判断if (time > 0 && xi - time + 1 > 0 && isCat[xi - time + 1][yi]) return false; // 被猫捕获(前序状态)if (xi - time > 0 && isCat[xi - time][yi]) return false; // 被猫捕获(当前状态)if ((xi == xt && yi == yt) || time == 8) return true; // 所有猫均移除边界, 总有一条路径到达终点return any_of(DIR.begin(), DIR.end(), [&](const pair<int, int> dir) {return dfs(xi + dir.first, yi + dir.second, time + 1);});
}int main() {int xi, yi;string s;for (int i = 0; i < 8; ++i) {cin >> s;for (int j = 0; j < 8; ++j) {switch (s[j]) { // 太久没用过 switch 了, 心血来潮用一下case 'S': isCat[i][j] = true; break;case 'M': xi = i, yi = j; break;case 'A': xt = i, yt = j; break;}}}cout << (dfs(xi, yi, 0) ? "Win" : "Lost");return 0;
}
5. 争渡 [动态规划]
数据范围:1≤n≤200,1≤Li≤Ri≤1041≤n≤200,1≤L_i≤R_i≤1041≤n≤200,1≤Li≤Ri≤104
输入
第一行一个整数n,表示人生的阶段数。
接下来n行,每行两个整数Li, Ri,表示这个阶段的状态值的下限和上限。
输出
输出仅一行,表示方案数mod 998244353的结果。
输入样例
4
1 6
3 5
1 4
4 6
输出样例
4
代码
#include<bits/stdc++.h>using namespace std;
using ull = unsigned long long;ull dp[205][10005];
int lim[205][2];int main() {auto &lim_ = lim;auto &dp_ = dp;int n;cin >> n;for (int i = 1; i <= n; ++i) cin >> lim[i][0] >> lim[i][1];dp[0][0] = 1ll; // 边界条件for (int i = 1, L, R; i <= n; ++i) {L = lim[i][0], R = lim[i][1];ull sum = 0;for (int j = 0; j < L; ++j) sum += dp[i - 1][j] % 998244353;for (int j = L; j <= R; ++j) {dp[i][j] = sum;sum += dp[i - 1][j] % 998244353;}}ull ans = 0;for (int j = lim[n][0]; j <= lim[n][1]; ++j) {ans += dp[n][j] % 998244353;}cout << ans % 998244353;return 0;
}
题单来源:QQ群200162761
。
2022-6-4 小明爱上课,切木头,最多分成多少块,躲猫猫,争渡相关推荐
- Python_封装案例(小明爱跑步)
1.封装的特性和需求分析 封装是面向对象编程的一大特性, 我们在使用面向对象开发程序的时候, 第一步就应该现在需求分析, 然后根据明确的职责把不同的属性和方法封装到一个又一个抽象的类中, 之所以说是抽 ...
- Python中面向对象封装案例——小明爱跑步、摆放家具
文章目录 面向对象封装案例 目标 1. 封装 2. 小明爱跑步 2.1 小明爱跑步扩展 -- 小美也爱跑步 3. 摆放家具 3.1 创建家具 3.2 创建房间 3.3 添加家具 3.4 小结 面向对象 ...
- python入门笔记——面向对象基础1_5(小明爱跑步案例)
案例: 小明爱跑步:实际项目需求如下 ①小明体重 75.0 公斤 ②小明每次跑步 会减少0.5公斤 ③小明每次吃东西 会增加 1公斤 1.案例分析: 名字提炼法,小明--人类: 属性--体重 动词提炼 ...
- 51nod3107 小明爱宝石
3107 小明爱宝石 小明想要创造n种魔法宝石.小明可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个宝石合成另一种宝石(不消耗魔力值).请你帮小明算出合成某种宝石的所需的最小花费. 输入 首先一 ...
- 51nod3108 小明爱换钱
3108 小明爱换钱 小明非常喜欢换钱,这天他想到一个换钱游戏,游戏规则是这样的,从一件价值1元的小物品开始.然后,经过反复的交换,不断增加手中物品的价值.在每次兑换中,如果您的物品价值大于或等于R元 ...
- 【51nod】3058 小明爱集合
小明爱集合 Link 解题思路 因为集合内不会重复,setsetset 不兼容重复,所以直接把所以数据丢到 setsetset 里面,最后 n+mn+mn+m 和剩下数字的差就是重复的个数. code ...
- 【树状数组】 小明爱拦截
[树状数组] 小明爱拦截 题目 解题思路 求最长不上升序列 将导弹高度从大到小排序 以tm的发射时间为下标,将以其结尾的拦截最大值丢进树状数组维护 在当前导弹发射时间前并进了树状数组的(也就是高度比当 ...
- 小明爱跑步-扩展-多个对象属性之间互不干扰
class Person:def __init__(self, name, weight):# self.属性 = 形参self.name = nameself.weight = weightdef ...
- python小明爱跑步
class Person:def __init__(self, name, weight):self.name = nameself.weight = weightdef __str__(self): ...
最新文章
- 前后台使用ajax传list的时候,用value[] 获取值
- poj 3275(传递闭包)
- DL_WITH_PY系统学习(第2章)
- [洛谷1390]公约数的和
- laravel mysql驱动_Laravel 如何同时使用不同数据库驱动
- 计算机组成原理简单计算机设计,计算机组成原理课设.doc
- c语言删除字符串s中与c相同的字符串,看不懂这段c语言代码的思路,目的是删除字符串1中与字符串2相同的字符...
- android 打开设备失败
- 设置分录行按钮监听事件
- Android开发的前景到底怎么样?
- a form 出口享惠情况_关税聚焦 | 报关单“出口享惠情况”填报解读
- bigworld引擎
- Taro小程序生成二维码保存本地
- 1.按钮点击的四种方式
- 双绞线的制作T568A线序,T568B线序
- 如何成为一名数据分析师 | 推荐收藏
- 华为防火墙安全策略-1
- iphone/ipad保存图片问题(已解决)
- CSDN如何修改自己的博客名称
- AssertionError 的来源