牛客刷题-Day8

news/2025/10/7 1:22:33/文章来源:https://www.cnblogs.com/Cocoicobird/p/19121978

牛客刷题-Day8

今日刷题:\(1036-1040\)

1036 凸多边形的划分

题目描述

给定一个具有 \(N\) 个顶点的凸多边形,将顶点从 \(1\)\(N\) 标号,每个顶点的权值都是一个正整数。将这个凸多边形划分成 \(N-2\) 个互不相交的三角形,试求这些三角形顶点的权值乘积和至少为多少。

输入描述

输入第一行为顶点数 \(N\)
第二行依次为顶点 \(1\) 至顶点 \(N\) 的权值。

输出描述

输出仅一行,为这些三角形顶点的权值乘积和的最小值。

示例

输入

5
121 122 123 245 231

输出

12214884

备注

对于 \(100\%\) 的数据,有 \(N≤50\),每个点权值小于 \(10^9\)

解题思路

  • 状态表示:\(f_{i,j}\) 表示将 \([i,j]\) 区间的点划分为 \(j-i-2\) 个三角形的权值乘积和;
  • 状态计算:枚举顶点 \(k\in[i+1,k-1]\),这样就可以将 \([i,j]\) 划分为三个区间,则 \(f_{i,j}=max\{f_{i,j},f_{i,k}+f_{k,r}+a_i*a_k*a_j\}\)

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 55;template <typename T> void Out(T x) {if(x < 0) putchar('-') , x = -x;if(x > 9) Out(x / 10);putchar(x % 10 + '0');
}int n, a[N];
__int128 f[N][N];int main() {scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);for (int i = 1; i <= n; i++)f[i][i + 2] = (__int128) a[i] * a[i + 1] * a[i + 2];for (int len = 4; len <= n; len++)for (int l = 1; l + len - 1 <= n; l++) {int r = l + len - 1;f[l][r] = 1e30;for (int k = l + 1; k <= r - 1; k++)f[l][r] = min(f[l][r], f[l][k] + f[k][r] + (__int128) a[l] * a[k] * a[r]);}Out(f[1][n]);return 0;
}

1037 [NOIP2003]加分二叉树

题目描述

设一个 \(n\) 个节点的二叉树 \(tree\) 的中序遍历为 \((l,2,3,…,n)\),其中数字 \(1,2,3,…,n\) 为节点编号。每个节点都有一个分数(均为正整数),记第 \(j\) 个节点的分数为 \(d_i\)\(tree\) 及它的每个子树都有一个加分,任一棵子树 \(subtree\)(也包含 \(tree\) 本身)的加分计算方法如下:
\(subtree\) 的左子树的加分\(\times\)\(subtree\) 的右子树的加分\(+\)\(subtree\) 的根的分数
若某个子树为主,规定其加分为 \(1\),叶子的加分就是叶节点本身的分数。不考虑它的空子树。 试求一棵符合中序遍历为 \((1,2,3,…,n)\) 且加分最高的二叉树 \(tree\)
要求输出:
(1)tree的最高加分
(2)tree的前序遍历

输入描述

\(1\) 行:一个整数 \(n\)\(n<30\)),为节点个数。
\(2\) 行:\(n\) 个用空格隔开的整数,为每个节点的分数(分数\(<100\))。

输出描述

\(1\) 行:一个整数,为最高加分(结果不会超过 \(4,000,000,000\))。
\(2\) 行:\(n\) 个用空格隔开的整数,为该树的前序遍历。

示例

输入

5
5 7 1 2 10

输出

145
3 1 2 4 5

解题思路

  • 状态表示:\(f_{i,j}\) 表示节点 \(i\)\(j\) 成树的分数;
  • 状态计算:因为只有中序遍历,因此无法确定二叉树的形状,\(i\)\(j\) 的每个点都有可能成为该子树的根节点,因此 \(f_{i,j}=max\{f_{i,j}, f_{i,k-1}*f_{k+1,j}+f_{k,k}\}\)

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 50, M = 20010, mod = 998244353;
typedef pair<int, int> PII;
typedef long long LL;int n;
LL f[N][N], root[N][N]; // 从节点 i 到 j 成树的分数void print(int l, int r) {if(l > r) return;printf("%lld ", root[l][r]);print(l, root[l][r] - 1);print(root[l][r] + 1, r);
}int main () {scanf("%d", &n);for(int i = 1; i <= n; i ++) {scanf("%lld", &f[i][i]);f[i][i - 1] = 1; // 左为空f[i + 1][i] = 1; // 右为空root[i][i] = i;}for(int len = 2; len <= n; len ++) {for(int i = 1; i + len - 1 <= n; i ++) {int j = i + len - 1; // 计算终点for(int k = i; k <= j; k ++) {if(f[i][j] < f[i][k - 1] * f[k + 1][j] + f[k][k]) {f[i][j] = f[i][k - 1] * f[k + 1][j] + f[k][k];root[i][j] = k;}}}}printf("%lld\n", f[1][n]);print(1, n);return 0;
}

1038 [NOIP2008]传纸条

题目描述

小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个 \(m\)\(n\) 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标 \((1,1)\),小轩坐在矩阵的右下角,坐标 \((m,n)\)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。
在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。
还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用 \(0\) 表示),可以用一个 \(0-100\) 的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度只和最大。现在,请你帮助小渊和小轩找到这样的两条路径。

输入描述

输入第一行有 \(2\) 个用空格隔开的整数 \(m\)\(n\),表示班里有 \(m\)\(n\) 列(\(1<=m,n<=50\))。
接下来的 \(m\) 行是一个 \(m*n\) 的矩阵,矩阵中第 \(i\)\(j\) 列的整数表示坐在第 \(i\)\(j\) 列的学生的好心程度。每行的 \(n\) 个整数之间用空格隔开。

输出描述

输出共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。

示例

输入

3 3
0 3 9
2 8 5
5 7 0

输出

34

备注

\(30\%\) 的数据满足:\(1<=m,n<=10\)
\(100\%\) 的数据满足:\(1<=m,n<=50\)

解题思路

  • 状态表示:\(f_{i,j,p,q}\) 表示从 \((1, 1)\)\((i, j), (p, q)\) 的好心程度,\((i, j)\) 为左下方路径,\((p, q)\) 为右上方路径;
  • 状态计算:\(f_{i,j,p,q} = max4(f_{i,j-1,p,q-1}, f_{i,j-1,p-1,q},f_{i-1,j,p,q-1}, f_{i-1,j,p-1,q}) + g_{i,j} + g_{p,q}\),注意不要经过重复的点。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 55;int m, n;
int g[N][N];
int f[N][N][N][N]; // f[i][j][p][q] 表示从 (1, 1) 到 (i, j) (p, q) 的好心程度// (i, j) 为左下方路径 (p, q) 为右上方路径 int max4(int a, int b, int c, int d) {return max(max(a, b), max(c, d));
}int main() {scanf("%d%d", &m, &n);for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)scanf("%d", &g[i][j]);for (int i = 1; i <= m; i++)for (int j = 1; j < n; j++)for (int p = 1; p <= m; p++)for (int q = j + 1; q <= n; q++)f[i][j][p][q] = max4(f[i][j - 1][p][q - 1], f[i][j - 1][p - 1][q], f[i - 1][j][p][q - 1], f[i - 1][j][p - 1][q]) + g[i][j] + g[p][q];printf("%d\n", f[m][n - 1][m - 1][n]);return 0;
}

1039 [NOIP2000]方格取数

题目描述

设有 \(N*N\) 的方格图(\(N ≤ 10\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 \(0\)。如下图所示,见样例:
image
某人从图的左上角的 \(A\) 点出发,可以向下行走,也可以向右走,直到到达右下角的 \(B\) 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 \(0\))。
此人从 \(A\) 点到 \(B\) 点共走两次,试找出 \(2\) 条这样的路径,使得取得的数之和为最大。

输入描述

输入的第一行为一个整数 \(N\)(表示 \(N*N\) 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的 \(0\) 表示输入结束。

输出描述

只需输出一个整数,表示 \(2\) 条路径上取得的最大的和。

示例

输入

8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21 
5 6 4
6 3 15
7 2 14
0 0 0

输出

67

解题思路

\(1038\) 类似。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 15;int n, a[N][N];
int f[N][N][N][N];int max4(int a, int b, int c, int d) {return max(max(a, b), max(c, d));
}int main() {scanf("%d", &n);while (1) {int i, j, v;scanf("%d%d%d", &i, &j, &v);if (i == 0 && j == 0 && v == 0)break;a[i][j] = v;}for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)for (int p = 1; p <= n; p++)for (int q = 1; q <= n; q++) {f[i][j][p][q] = max4(f[i][j - 1][p][q - 1], f[i][j - 1][p - 1][q], f[i - 1][j][p][q - 1], f[i - 1][j][p - 1][q]) + a[i][j] + a[p][q];if (i == p && j == q)f[i][j][p][q] -= a[i][j];}printf("%d\n", f[n][n][n][n]);return 0;
}

1040 [NOIP2005]过河

题目描述

在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:\(0\)\(1\)\(……\)\(L\)(其中 \(L\) 是桥的长度)。坐标为 \(0\) 的点表示桥的起点,坐标为 \(L\) 的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是 \(S\)\(T\) 之间的任意正整数(包括 \(S,T\))。当青蛙跳到或跳过坐标为 \(L\) 的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度 \(L\),青蛙跳跃的距离范围 \(S,T\),桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。

输入描述

第一行有一个正整数 \(L\)\(1<=L<=10^9\)),表示独木桥的长度。
第二行有三个正整数 \(S\)\(T\)\(M\),分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中 \(1<=S<=T<=10\)\(1<=M<=100\)
第三行有 \(M\) 个不同的正整数分别表示这 \(M\) 个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。
所有相邻的整数之间用一个空格隔开。

输出描述

只包括一个整数,表示青蛙过河最少需要踩到的石子数。

示例

输入

10
2 3 5
2 3 5 6 7

输出

2

备注

对于 \(30\%\) 的数据,\(L<=10000\)
对于全部的数据,\(L<=10^9\)

解题思路

P1052 [NOIP 2005 提高组] 过河 题解
需要记住一个结论:定理(\(Frobenius\) 硬币问题,两个变量)
\(a\)\(b\) 是两个正整数,且 \(gcd(a,b)=1\)(即互质)。那么,最大的不能表示为 \(ax+by\)(其中 \(x,y\) 是非负整数)的正整数是:\(g(a,b)=ab−a−b\),这个数被称为 \(Frobenius\) 数。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 10010, M = 110;int L, S, T, m;
int a[M], dist[M];
int f[N], stone[N];int main() {cin >> L >> S >> T >> m;for (int i = 1; i <= m; i++)cin >> a[i];if (S == T) {int ans = 0;for (int i = 1; i <= m; i++)if (a[i] % S == 0)ans++;cout << ans << endl;return 0;}sort(a + 1, a + m + 1);int DIST = 72;for (int i = 1; i <= m; i++) {int d = a[i] - a[i - 1];if (d >= DIST)dist[i] = dist[i - 1] + DIST;elsedist[i] = dist[i - 1] + d;}for (int i = 1; i <= m; i++)stone[dist[i]] = 1;L = dist[m] + DIST;for (int i = 1; i <= L; i++) {f[i] = 0x3f3f3f3f;for (int j = S; j <= T; j++)if (i >= j)f[i] = min(f[i], f[i - j] + stone[i]);}int ans = 0x3f3f3f3f;for (int i = dist[m]; i <= L; i++)ans = min(ans, f[i]);cout << ans << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站开发 博客长沙百度网站制作

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运行 fn&#xff1b; 例如&#xff1a;子组件&#xff1a; <template><di…

泉州模板做网站厦门酒店网站建设

在本篇博客中&#xff0c;我们将探讨 UserDetailsService 的重要性&#xff0c;以及如何通过实际示例在 Spring Security 中实现它。 理解 UserDetailsService UserDetailsService 是 Spring Security 提供的一个接口&#xff0c;用于在认证过程中获取用户详细信息。DaoAuthe…

石家庄制作网站的公司简介德州网络

在当前的项目中&#xff0c;使用的是stm32mp157&#xff0c;在烧写系统固件时&#xff0c;有少量的板子使用stm32的stm32cubeProgrammer烧录软件&#xff0c;通过USB接口&#xff0c;死活就是烧录不上&#xff0c;烧录到一半&#xff0c;usb直接就断开了&#xff0c;没办法&…

Educational Codeforces Round 183 (Rated for Div. 2)

A. Candies for Nephews 题意:求大于等于\(n\)的最小\(3\)的倍数。点击查看代码 #include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::cout << (n + 2) / 3 * …

免费域名怎么做网站我想做代理商

SnowNLP: 一个简单的中文文本处理库 SnowNLP是一个python写的类库&#xff0c;可以方便的处理中文文本内容&#xff0c;是受到了TextBlob的启发而写的&#xff0c;由于现在大部分的自然语言处理库基本都是针对英文的&#xff0c;于是写了一个方便处理中文的类库&#xff0c;并且…

网站开发维护多少钱软件项目管理考试题及答案

maven打jar包错误 引起错误的原因是在 SpringbootStudyApplication 类中&#xff0c;加入了下面注释中的代码&#xff08;监听项目启动&#xff0c;然后打开浏览器&#xff09;&#xff0c;单纯删掉注释代码是无法解决问题的&#xff0c;可能的原因是由于加入这部分代码而impo…

做猎头要用的网站知乎超简单网页制作模板

文章目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;命令实例1、文件改名&#xff08; 重命名&#xff09;2、移动文件3、将test目录下的文件text1.txt text2.txt text3.txt移动到目录mv中。4、将文件file1改名为file2&#xff0c;如果file…

长春网站建设那家好如何做网站活动

[js] 使用ajax请求真的不安全吗&#xff1f;为什么&#xff1f; AJAX是发送HTTP请求的一种方式&#xff0c;只不过浏览器给它加了一个同源策略而已。 所以从这一点可以得出一个结论&#xff1a;AJAX本质上安全性和HTTP请求一样个人简介 我是歌谣&#xff0c;欢迎和大家一起交…

广州网站优化工具服务静态网站注入

动态代理jdk的Proxy与Spring的CGlib 文章目录 动态代理jdk的Proxy与Spring的CGlib1. 为什么要使用动态代理&#xff1f;2. JDK Proxy 动态代理面向接口的动态代理3. CGlib动态代理4. 两个动态代理的区别 1. 为什么要使用动态代理&#xff1f; 动态代理&#xff1a;在不改变原有…

高三闲话 #2

“那你们现在坐在这,一定是失败了。”小食堂外面有一只猫,每天吃饭都可以看到它趴在那里,被投喂一些食物。不过我在它眼中看不到任何“乞食”的色彩,更像是在等待被“进贡”。我们每天吃完饭回去都要欣赏那只猫,G…

D. Inversion Value of a Permutation edu div2

题意:给出一个排列,其逆序值为:包含至少一个逆序对的子区间数量 给出n和k,要求构造一个长度为n的,逆序值为k的排列 很显然,如果一个排列内,若是有两个位置逆序,那么以这两个位置为起点,找到的所有子区间可能会…

Mineserver

Mineserverhttps://github.com/CoolManBob/mineserver 项目简介(根据 README)名称:Mineserver用途:一个 Minecraft Alpha(早期版 Minecraft) 的 自定义服务器软件,用 C++ 编写,支持 Windows 和 Linux 平台。Gi…

首钢建设二公司网站博客网站开发背景及作用

之前的表单验证都是用js写的&#xff0c;这里也可以使用tp框架的验证。但是两者比较而言还是js验证比较好&#xff0c;因为tp框架验证会运行后台代码&#xff0c;这样运行速度和效率就会下降。  自动验证是ThinkPHP模型层提供的一种数据验证方法&#xff0c;可以在使用create创…

个人博客公告

由于github部署的网站维护稍微有点繁琐(有点懒了更新了) 原来的域名gannia.top 已经到期了暂时还没有续费的打算(指香港云服务器不清楚怎么推掉域名,想要更换阿里云域名的) 目前暂时还是用着原来的域名 https://t…

一个刚大一的普通大学生

title: 一个刚大一的普通大学生 tags: [] categories:生活 author: Tokepson date: 2025-05-01 00:32:00关于我 一名正在山东上大学的普通大学生(虽然说是在上海成长的。。。) 在多次了解到个人网站领域的信息后,出…

通过利用百度对于外链的检测算法上的缺陷

友情链接欺骗,通过利用百度对于外链的检测算法上的缺陷,可以实现自己的网站所有对外的链接,被判定为“不是站长真正的去推荐”的外链,让百度自动过滤掉这类链接的计算分值。 第四种:快速排名,目前快速排名技术有…

用django做网站网站seo关键词排名推广

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

网站建设 我们是专业的网页制作的模块命名规范

描述 从日志中读取数据时&#xff0c;有一条数据不符合规范&#xff0c;导致logstash读取数据插入时出错&#xff0c;而插件又无限尝试插入&#xff0c;导致堵塞。 解决方案 找到logstash文件夹目录&#xff0c;例如是&#xff1a;/data/logstash-7.3.2 cd /data/logstash-…

网站开发报告参考文献wordpress 没有样式表

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Discord

DiscordDiscord 本质上是一个 免费语音、视频、文字社群软件,最早是为游戏玩家设计的,后来扩展成面向各种社区。 主要特点:语音/视频/文字聊天:实时语音频道、群聊、私聊。服务器(Server)+频道(Channel) 组织形…