20240930模拟赛

news/2024/9/30 16:02:24

T1连珠风暴
(necklace.pas/c/cpp)
问题描述:

  • 给定M种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链。
    问能做成多少种不重复的项链.
    并且两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一起,且对应珠子的颜色相同。

样例输入:

  • 2 5

样例输出:

  • 8

下图是样例解释:

数据范围:

  • 30%: n,m<=4
  • 60%: n,m<=5
  • 100%: nm<=32

由于范围非常小,所以我们只需要暴力枚举,复杂度是\(O(n^m n ^2)\)

code

#include <bits/stdc++.h>
using namespace std;
#define int long longint m, n, ans, tot;
int f[40], d[40];map <int, bool> mp;bool check()
{tot = 0;for(int k = 0;k < n;k++){int cnt = 0;for(int i = 0 + k;i < n + k;i++){int j = i % n;cnt = cnt * m + f[j];}if(mp[cnt] == 1) return 0;d[++tot] = cnt;}reverse(f, f + n);for(int k = 0;k < n;k++){int cnt = 0;for(int i = 0 + k;i < n + k;i++){int j = i % n;cnt = cnt * m + f[j];}if(mp[cnt] == 1) return 0;d[++tot] = cnt;}for(int i = 1;i <= tot;i++) mp[d[i]] = 1;reverse(f, f + n);return 1;
}void dg(int dep)
{if(dep == n){if(check()) {ans++;}return;}else{for(int i = 0;i < m;i++){f[dep] = i; dg(dep + 1);}}
}signed main()
{freopen("necklace.in", "r", stdin);freopen("necklace.out", "w", stdout);cin >> m >> n;if(m == 1){cout<<1<<"\n";return 0;}if(n == 1){cout<<m<<"\n";return 0;}dg(0);cout<<ans<<"\n";return 0;
}

T2道路修建
问题描述:

  • 为了保护放牧环境,避免牲畜过度啃咬同一个地方的草皮,牧场主决定利用不断迁移牲畜进行喂养的方法去保护牧草。然而牲畜在迁移过程中也会啃食路上的牧草,所以如果每次迁移都用同一条道路,那么该条道路同样会被啃咬过度而遭受破坏。
    现在牧场主拥有F个农场,已知这些农场至少有一条路径连接起来(不一定是直接相连),但从某些农场去另外一些农场,至少有一条路可通行。为了保护道路上的牧草,农场主希望再建造若干条道路,使得每次迁移牲畜时,至少有2种迁移途径,避免重复走上次迁移的道路。已知当前有的R条道路,问农场主至少要新建造几条道路,才能满足要求?
    输入描述
    第一行2个正整数,分别为n和m
    以下m行,每行2个数,表示连接的编号
    输出描述:
    一行一个数,表示至少新建的道路数目。
    样例输入:
    *7 7
    1 2
    2 3
    3 4
    2 5
    4 5
    5 6
    5 7
    样例输出:
    *2

数据范围:

  • 30%:n<=10 m<=20
  • 60%: n<=100 m<=2000
  • 100%: n<=100000 m<=500000

此题是边双联通分量模版,但我不会。
边双联通分量的定义是在一张连通的无向图中,对于两个点\([u]\)\([v]\),如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 \([u]\)\([v]\)边双连通。所以此题转化为至少需要添加几条边使之变为边双联通图。
由于我对图论中的联通性问题一窍不通,所以先引入割点的概念,再介绍tarjan算法。
割点

  • 对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点(又称割顶)
  • 朴素的想法,暴力删除每一个点,再用dfs判断是否联通,复杂度\(O(n(n + m))\),复杂度过高,考虑tarjan。
  1. 我们按照dfs序给每个点打上时间戳。
    2.定义num[u],记录DFS对每个点的访问顺序, low[v],记录v和v的后代能连回的祖先num。如果low[v] >= num[u], 就说明在v这条支路上, 没有回退边连回u的祖先。

边双

  • 在DFS的过程中,low值相同的点在一个边双联通分量,再把每一个边双联通分量缩成一个点,问题转化为至少在树上增加几条边能使这棵树变为一个边双联通分量。
  • 易推导ans = (度为1的点数 + 1) \(/\) 2。
    code
#include <bits/stdc++.h>
using namespace std;
#define int long longconst int N = 100005;int n, m, low[N], dfn;
vector <int> g[N];void dfs(int u, int fa)
{low[u] = ++dfn;for(int i = 0;i < g[u].size();i++){int v = g[u][i];if(v == fa) continue;if(!low[v]) dfs(v, u);low[u] = min(low[u], low[v]);}
}int tarjan(){int degree[N];memset(degree, 0, sizeof degree);for(int i = 1;i <= n;i++)for(int j = 0;j < g[i].size(); j++)if(low[i] != low[g[i][j]])degree[low[i]]++;int res = 0;for(int i = 1;i <= n;i++)if(degree[i] == 1) res++;return res;
}signed main()
{freopen("road.in", "r", stdin);freopen("road.out", "w", stdout);cin >> n >> m;for(int i = 1;i <= m;i++){int a, b;cin >> a >> b;g[a].push_back(b);g[b].push_back(a);}dfn = 0;dfs(1, -1);int ans = tarjan();cout<<(ans + 1) / 2<<"\n";return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

9.23 ~ 9.30

集训9.23 集训第一天。 早晨因为太多人没拿早读资料被老登 D 了。 不是哥们你不早说 现在我上哪给你找资料去 😅 上午模拟赛。 发现 T1 的图挂了,于是看形式化题意;初始有一张 \(n\) 个点的完全图,接着删除 \(m\) 条边。 询问有多少长度为 \(13\) 的序列 \(p_1,...,p_{13}…

实时语音交互,打造更加智能便捷的应用

随着人工智能和自然语言处理技术的进步,用户对智能化和便捷化应用的需求不断增加。语音交互技术以其直观的语音指令,革新了传统的手动输入方式,简化了用户操作,让应用变得更加易用和高效。 通过语音交互,用户可以在不方便使用触屏操作例如驾驶、烹饪时通过语音指令进行操作…

基于大模型搭建运力业务的“小红书”

作者:京东物流 朱飞 一、背景问题 1、职能人员(运营管理人员)日常工作所涉及的知识信息包括业务最新SOP、发文、操作手册等,获取渠道较分散,很多都依靠线下传递(发邮件、咚咚分享等),目前运力业务各种Sop、操作手册等文档上千个,累计文字过百万,缺乏统一查询入口,需…

能力有限公司

曹明杰 202201170101 性格:外向、乐观、善于团队合作。他总是能够迅速适应新环境,并且有很强的领导能力。 擅长的技术:打游戏 兴趣爱好:阅读小说、旅行探索新地方。 项目角色:项目负责人、爬虫工程师 一句话宣言:乐观的编程领袖,以Python和云计算技术引领创新,热爱科幻…

Java的日期类都是怎么用的

Java中的Date 为什么用类表示日期,而不是像其他语言中那样用一个内置(built-in)类型来表示?例如,Visual Basic 中有一个内置的 date 类型,程序员可以采用#12/31/1999格式指定日期。看起来这似乎很方便,程序员只需要使用内置的 date 类型而不用考虑类。但实际上,VisualBas…

P7730 [JDWOI-1] 蜀道难

首先,区间增加定值并且要求单调不降,很容易想到差分。 于是先把 \(h\) 数组差分一下,题目的要求即为最小代价使得 \(h\) 均为非负数。 观察一下两种操作,发现 \(n\) 的范围很小,可以枚举操作的起点 \(i\) ,然后如果操作是压低,相当于 \(h[i]--,h[i+l[i]]++\) 。而如果操…

就叫它new Star2024 的WP好了

begin WP 跟着引导走就好,这个引导做的还不错,能教人怎么用IDAbase64 WP总算知道为啥面试会问我是不是不知道base64编码,原来这个就是啊,和北邮新生赛re签到题基本一样。 看懂逻辑,经典3并4后单表替换,然后写代码解决就好