首页 > 其他分享 >20240323 专项训练

20240323 专项训练

时间:2024-04-14 15:24:28浏览次数:27  
标签:专项 ch 训练 int ll read while le 20240323

random

给出一个有向无环的连通图。小 A 需要从 \(1\) 号点走到 \(n\) 号点。保证图里所有的点都能够到达 \(N\) 号点。小 A 每次会等概率的随机一个能直接走到的节点走过去。求小 A 从一号点走到 \(n\) 号点期望需要经过多长的路径。

对于 \(30\%\) 的数据,保证 \(1 \le n, m \le 15\)。

对于 \(100\%\) 的数据,保证 \(1 \le n, m \le 2 \times 10^5\)。

边权不会超过 \(10000\) 且为正整数。

30 pts 做法

枚举从 \(1\) 到 \(n\) 的所有路径计算。

100 pts 做法

经典期望题。考虑建反图,记 \(f_i\) 为 从 \(i\) 走到 \(n\) 点的期望路径长。

#include<bits/stdc++.h>
#define ll long long
#define N 200005
using namespace std;
ll read(){
	ll x = 0, f = 1; char ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
	while(isdigit(ch)) {x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}
	return x * f;
}
ll n, m, d[N], d1[N];
vector < pair < int, int > > G[N];
double f[N];
int main(){
	freopen("random.in", "r", stdin);
	freopen("random.out", "w", stdout);
	n = read(), m = read();
	for(int i = 1; i <= m; i++){
		int u = read(), v = read(), w = read();
		d[u]++; d1[u]++; G[v].push_back(make_pair(u, w));
	}
	queue < int > q;
	q.push(n);
	while(!q.empty()){
		int u = q.front(); q.pop();
		for(auto p : G[u]){
			int v = p.first, w = p.second;
			f[v] += (1.0 / d[v]) * (f[u] + w);
			if(--d1[v] == 0) q.push(v);
		}
	}
	printf("%.2lf\n", f[1]);
	return 0;
}

path

给定一个 \(N\) 个点 \(M\) 条边的有向图,可能包含自环或重边,不保证连通性。

每个点上有一个小写英文字母。对于一条路径,我们认为这条路径的权值是其中出现次数最多的字母的出现次数。现在小 A 希望你能够告诉他,这个图中的最大路径权值是多少。特殊的,如果这个权值是 \(\text{inf}\),则输出 \(0\) 即可。

对于 \(20\%\) 的数据,保证 \(1 \le n \le 15\)。
对于 \(50\%\) 的数据,保证 \(1 \le n \le 10^3\)。
对于 \(80\%\) 的数据,保证 \(1 \le n \le 10^5\)。
对于 $100% 的数据,保证 \(1 \le n, m \le 5 \times 10^5\)。

100 pts 做法

显然当图上有环时答案为 \(\text{inf}\)。下面考虑有向无环情形。

#include<bits/stdc++.h>
#define ll long long
#define N 500005
using namespace std;
ll read(){
	ll x = 0, f = 1; char ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
	while(isdigit(ch)) {x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}
	return x * f;
}
ll n, m, val[N], d[N], cnt;
ll f[N][30], ans;
vector < int > G[N];
int main(){
	freopen("path.in", "r", stdin);
	freopen("path.out", "w", stdout);
	n = read(), m = read();
	string s; cin >> s;
	for(int i = 0; i < n; i++)
	  val[i + 1] = s[i] - 'a' + 1;
	for(int i = 1; i <= m; i++){
		int u = read(), v = read();
		G[u].push_back(v); d[v]++;
	}
	queue < int > q;
	for(int i = 1; i <= n; i++) if(!d[i]) q.push(i);
	while(!q.empty()){
		int u = q.front(); q.pop(); cnt++;
		for(auto v : G[u]){
			if(!(--d[v])) q.push(v);
			for(int i = 1; i <= 26; i++){
				if(i == val[u]) f[v][i] = max(f[v][i], f[u][i] + 1);
				else f[v][i] = max(f[v][i], f[u][i]);
			}
		}
	}
	if(cnt != n) { printf("0\n"); return 0; }
	for(int i = 1; i <= n; i++) f[i][val[i]]++;
	for(int i = 1; i <= n; i++)
	  for(int j = 1; j <= 26; j++)
		ans = max(ans, f[i][j]);
	printf("%lld\n", ans);
	return 0;
}

标签:专项,ch,训练,int,ll,read,while,le,20240323
From: https://www.cnblogs.com/hayzxjr/p/18091126

相关文章

  • 20240330 专项训练
    Tajan/序列问题专项save原题链接煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援......
  • 代码随想录算法训练营第8天 | 字符串 344.反转字符串 541. 反转字符串II 卡码网:54.
    leetcode344.反转字符串题目344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。解题思路实现代码......
  • 代码随想录算法训练营第9天 | 字符串(KMP算法) 28. 找出字符串中第一个匹配项的下标
    leetcode28.找出字符串中第一个匹配项的下标题目28.找出字符串中第一个匹配项的下标给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。解题思路实现代......
  • 代码随想录算法训练营第7天 | 哈希表 454.四数相加II 383. 赎金信 15. 三数之和 18.
    leetcode454.四数相加II题目454.四数相加II解题思路实现代码leetcode383.赎金信题目383.赎金信解题思路实现代码leetcode15.三数之和题目15.三数之和解题思路实现代码leetcode454.四数相加II题目18.四数之和解题思路实现代码......
  • 25天【代码随想录算法训练营34期】第七章 回溯算法part02 ( ● 216.组合总和III ● 17
    **216.组合总和III**classSolution:defcombinationSum3(self,k:int,n:int)->List[List[int]]:result=[]self.backtracking(k,n,1,[],result,n)returnresultdefbacktracking(self,k,n,startingIndex,path,result,......
  • 24天【代码随想录算法训练营34期】第七章 回溯算法part01 ( ● 理论基础 ● 77. 组合
    **理论基础**voidbacktracking(参数){if(终止条件){存放结果;return;}for(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){处理节点;backtracking(路径,选择列表);//递归回溯,撤销处理结果}}......
  • PP-HumanSeg安装、运行、训练、测试
    参考paddleseg官网https://aistudio.baidu.com/projectdetail/2189481?channelType=0&channel=0零、准备工作1.用conda创建虚拟环境#1.查询conda环境下有哪些虚拟环境condainfo--envs#2.创建指定python版本的环境condacreate-nPaddleSeg_py_38python=3.8#3.......
  • dfs序专题训练
    DFS序专题NC13611https://ac.nowcoder.com/acm/problem/13611题意:要求树上任意两点相同颜色之间的路径上的点也是相同颜色,k种颜色,求方案数Solution:原问题等价于将树分割成若干连通块且相互之间颜色不同其实是道数论题。题意可以转化为将树分割为不超过\(k\)个连通块,每个连......
  • day2-Python训练营
    1.ClassOne1.如何正确关闭一个Vmware中的虚拟机2.为Ubuntu安装一些软件step1:openterminal或者快捷键ctrl+shift+T打开终端,然后ping一下,看网络是否连通。step2:sudoaptupdate,判断安装源(默认是美国的源,类似于软件商店)是否连通;step3:安装两个软件,ssh和vim,sudoaptin......
  • 蓝桥杯训练
    P8712[蓝桥杯2020省B1]整数拼接-洛谷|计算机科学教育新生态(luogu.com.cn)题解:这道题和牛客类似,我们换一个思路我们可以开一个二维数组  一位用来记录拼在后面数的长度,一个用来记录这个数乘上10的(后面数的长度)模10我们直接乘1到10,全部记录下来然后枚举右边的数,看......