牛客小白月赛102(A,B,C,D,E)(思维,分层图,换根dp)

server/2024/10/18 2:05:31/

比赛链接

牛客小白月赛102

A题

思路

s e t set set检查 1 1 1~ k k k是不是全都出现过。

代码
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int n, k;
int a[N];
void solve()
{cin >> n >> k;set<int> st;for (int i = 1; i <= n; i++){cin >> a[i];st.insert(a[i]);}for (int i = 1; i <= k; i++){if (!st.count(i)){cout << "NO" << endl;return;}}cout << "YES" << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

B题

思路

原式可以变化为: x = a + 1 x x = a + \frac{1}{x} x=a+x1,同时乘以 x x x得到: x 2 = a x + 1 x^{2} = ax + 1 x2=ax+1

因为 a a a是已知,所以原问题便转化为了求一元二次方程的解。

x = a ± a 2 + 4 2 x = \frac{a \pm \sqrt{a^{2} + 4}}{2} x=2a±a2+4 ,因为 a − a 2 + 4 < 0 a - \sqrt{a^{2} + 4} < 0 aa2+4 <0,所以 x = a + a 2 + 4 2 x = \frac{a + \sqrt{a^{2} + 4}}{2} x=2a+a2+4

代码
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
double a;
void solve()
{cin >> a;double ans = (a + sqrtl(a * a + 4)) / 2.0;cout << fixed << setprecision(12) << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

C题

思路

假如sum大于总和,那么我们要把小的数改大,否则,我们要把大的数改小,排完序后直接贪心即可。

代码
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;int n, sum;
int a[N];
void solve()
{cin >> n >> sum;int res = 0;for (int i = 1; i <= n; i++){cin >> a[i];res += a[i];}sort(a + 1, a + 1 + n);int ans = 0;if (sum > res){int cha = sum - res;for (int i = 1; i <= n; i++){int op = 1e4;if (op - a[i] >= cha){ans++;break;}else{ans++;cha -= (op - a[i]);}}}else{int cha = res - sum;for (int i = n; i >= 1; i--){int op = -1e4;if (a[i] - op >= cha){ans++;break;}else{cha -= (a[i] - op);ans++;}}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

D题

思路

d i s t [ i ] [ j ] dist[i][j] dist[i][j]表示走到 i i i号节点,有 j j j天没有休息的最短时间。其中 d i s t [ i ] [ k + 1 ] dist[i][k+1] dist[i][k+1]表示走到 i i i号节点且休息的最短时间。

d i j k s t r a dijkstra dijkstra进行转移,对于第 j j j天没有休息的 d i s t [ u ] [ j ] dist[u][j] dist[u][j],其可以转移到下一个点 v v v d i s t [ v ] [ j + 1 : k + 1 ] dist[v][j+1:k+1] dist[v][j+1:k+1]

代码
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5, M = 10 + 5;
const int inf = 0x3f3f3f3f3f3f3f3f;int n, m, k;
int a[N];
int dist[N][M];
bool st[N][M];
vector<int> mp[N];
struct node
{int val, u, id;bool operator>(const node &w) const{return val > w.val;}
};
void dijkstra()
{priority_queue<node, vector<node>, greater<node>> q;for (int i = 1; i <= k; i++){if (i != k)dist[1][i] = 1;elsedist[1][k] = a[1];if (i != k)q.push({1, 1, i});elseq.push({a[1], 1, i});}while (q.size()){int d = q.top().val;int u = q.top().u;int id = q.top().id;q.pop();if (st[u][id])continue;st[u][id] = true;for (int i = 0; i < mp[u].size(); i++){int j = mp[u][i];int kkksc = id + 1;if (id == k)kkksc = 1;for (int op = kkksc; op <= k; op++){if (op == k){int len = a[j];if (dist[j][op] > d + len){dist[j][op] = d + len;q.push({dist[j][op], j, op});}}else{int len = 1;if (dist[j][op] > d + len){dist[j][op] = d + len;q.push({dist[j][op], j, op});}}}}}
}
void solve()
{cin >> n >> m >> k;k++;for (int i = 1; i <= n; i++){mp[i].clear();for (int j = 1; j <= k; j++){dist[i][j] = inf;st[i][j] = false;}}for (int i = 1; i <= n; i++){cin >> a[i];}for (int i = 1, u, v; i <= m; i++){cin >> u >> v;mp[u].push_back(v);mp[v].push_back(u);}dijkstra();int minn = inf;for (int i = 1; i <= k; i++){minn = min(minn, dist[n][i]);}cout << minn << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

E题

思路

换根dp板子题。

我们假设根节点为 1 1 1号节点,令 d p 1 [ i ] dp1[i] dp1[i]表示以 i i i为根的子树中, i i i的儿子到 i i i的后代的路径的最大值, d p 2 [ i ] dp2[i] dp2[i]为次大值。

之后我们考虑换根, d p [ i ] dp[i] dp[i]表示 i i i的父亲与 i i i上方的点形成的路径的最大值,之后用 d p [ i ] dp[i] dp[i]去更新 d p 1 [ i ] dp1[i] dp1[i] d p 2 [ i ] dp2[i] dp2[i]即可。

最后的答案即为: a n s [ c [ i ] ] = m a x ( a n s [ c [ i ] ] , d p 1 [ i ] + d p 2 [ i ] + w [ i ] ) ; ans[c[i]] = max(ans[c[i]], dp1[i] + dp2[i] + w[i]); ans[c[i]]=max(ans[c[i]],dp1[i]+dp2[i]+w[i]);

代码
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5;
const int inf = 1e18;int n;
int c[N], w[N];
int dp[N], dp1[N], dp2[N];
vector<int>mp[N];
vector<int>ans(N);
void modify(int &mx1, int &mx2, int mx)
{if (mx > mx1) mx2 = mx1, mx1 = mx;else if (mx > mx2)mx2 = mx;
}
void dfs1(int u, int fu)
{for (int j : mp[u]){if (j == fu) continue;dfs1(j, u);modify(dp1[u], dp2[u], dp1[j] + w[j]);}}
void dfs2(int u, int fu)
{if (u != 1){modify(dp1[u], dp2[u], dp[u]);}for (int j : mp[u]){if (j == fu) continue;if (dp1[u] != dp2[u] && dp1[u] == dp1[j] + w[j]){dp[j] = dp2[u] + w[u];}else dp[j] = dp1[u] + w[u];dfs2(j, u);}
}
void solve()
{cin >> n;for (int i = 1; i <= n; i++){dp[i] = dp1[i] = dp2[i] = 0;ans[i] = -inf;mp[i].clear();}for (int i = 1; i <= n; i++)cin >> c[i];for (int i = 1; i <= n; i++)cin >> w[i];for (int i = 1, u, v; i < n; i++){cin >> u >> v;mp[u].push_back(v);mp[v].push_back(u);}dfs1(1, -1);dfs2(1, -1);for (int i = 1; i <= n; i++){ans[c[i]] = max(ans[c[i]], dp1[i] + dp2[i] + w[i]);}for (int i = 1; i <= n; i++){if (ans[i] == -inf){cout << -1 << " ";}else cout << ans[i] << " ";}cout << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

http://www.ppmy.cn/server/131754.html

相关文章

nvm 常用命令清单

安装特定版本的 Node.js nvm install <version> 例如&#xff1a;安装 Node.js 20.15.0 nvm install 20.15.0 列出所有可安装的 Node.js 版本 nvm ls-remote 卸载某个 Node.js 版本 nvm uninstall <version> 例如&#xff1a;卸载 Node.js 20.15.0 nvm un…

底层框架和工具链

整体说明 一图胜千言&#xff0c;看看吧。 数据表导出 数据配置表导出算是一种无法绕开的基础设施吧。 大致使用 核心模块 项目由2个模块组成&#xff0c;一个是核心模块&#xff0c;另一个是图形化模块。 这里展示的是核心模块中的代码结构。 数据类型的相关截图。 图…

Matlab实现海洋捕食者优化算法优化回声状态网络模型 (MPA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 海洋捕食者优化算法&#xff08;Marine Predators Algorithm, MPA&#xff09;是一种基于海洋生物捕食行为的新型群体智能优化算法。MPA通过模拟海洋捕食者如鲨鱼、海豚等在寻找猎物时的追踪、包围和攻击行为&…

图论day57|101.孤岛的总面积(卡码网)【逆向思维】 、102.沉没孤岛(卡码网)、103.水流问题(卡码网)【逆向思维】

图论day57|101.孤岛的总面积(卡码网&#xff09;【逆向思维】 、102.沉没孤岛&#xff08;卡码网&#xff09;、103.水流问题(卡码网&#xff09;【逆向思维】 101.孤岛的总面积(卡码网)102.沉没孤岛&#xff08;卡码网&#xff09;103.水流问题(卡码网)1.常规思维2.逆向思维 1…

从opencv-python入门opencv--GUI功能之图像和视频操作

从opencv-python入门opencv--GUI功能之图像和视频操作 一、文章介绍二、图像的读取显示及保存1、 cv.imread()2、cv.imshow()3、cv.imwrite()4、cv.waitKey()5、cv.destroyAllWindows()6、图像读写存完整示例代码及效果 三、视频读取保存功能1、cv.VideoCapture()&#xff08;1…

SpringBoot项目错误日志打印不容易注意到的坑

文章目录 一、不要使用e.printStackTrace()二、不要使用log.error(e.getMessage())三、不要在日志打印时进行字符串拼接 先说结论&#xff1a;建议使用log.error(String msg, Throwable t)方式打印错误日志&#xff0c;最好在加上try中的各种参数的信息方便排查 Slf4j public …

YARN调度原理详解

YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Hadoop 集群的资源管理和作业调度框架&#xff0c;它的设计旨在更好地管理和调度 Hadoop 集群中的资源。YARN 解决了传统 Hadoop MapReduce 中资源管理与作业调度紧耦合的问题&#xff0c;使得不同类型的计算任…

数据中心物理安全的历史和演变

在当今的数字时代&#xff0c;数据中心托管已成为我们互联世界的支柱。这些设施在存储、管理和处理我们日常生活所需的大量信息方面发挥着至关重要的作用。从社交媒体平台和电子商务网站到流媒体服务和云计算&#xff0c;数据中心为我们依赖的数字服务提供支持。 随着企业越来…