洛谷链接 &Atcoder 链接
本篇题解为此题较简单做法 及较少码量 ,并且码风优良,请放心阅读。
给定一个集合形式,判断此集合是 dict
还是 set
。
简单的模拟题 。
首先需要特判 {}
的情况,应直接输出 dict
。
接着观察两个集合的特征,很容易即可发现 dict
和 set
的最明显的区别 就是一个有 :
一个没有,而我们需要注意 expr
可是任何集合或者数字 ,所以有可能出现 {1,{2:3}}
的情况,而这种情况就不能直接看有无冒号进行判断了 。
我们需要用 来记录当前是第几层括号 ,如果在第一层括号中发现了冒号 ,那么这个集合就是 dict
了,反之就是 set
。
经过以上分析,很容易即可写出代码 了:
提交记录
洛谷链接 &CF 链接
本篇题解为此题较简单做法 及较少码量 ,并且码风优良,请放心阅读。
给定 个点,在一条数轴上,位置为 ,你的位置为 ,你要经过 个点,求至少 要走的距离。
首先因为输入是乱序 的,所以需要由小到大排序 。
又因为需要经过 个点,所以要么不走左端点 ,要么不走右端点 ,这样分两种情况讨论,分别求出答案取 即可。
首先分析情况 ,要么 ,要么 ,要么 ,第二种不论先去 还是 结果都一样。所以不讨论 ,第一三种需要讨论一下,对于第一种一定是先去 结果最小, 对于第三种一定是先去 结果最小,只需对这两种分别处理最后取 即可,由此分析可得这种情况的方程式 为:
同样分析可得情况 的方程式 :
最后对两种情况取 即可。
经过以上分析,很容易即可得出代码 了:
提交记录:
时间:1s 空间:512M
题目描述
小埋最近在学习有向图的遍历相关知识,小埋学习过图的遍历的相关方法,可以使用 或者 来遍历整个有向图,但是小埋发现这个问题有一些不一样,这个图的遍历是问你当前点能够到达的点的最大编号,小埋希望你能帮她解决这个问题。
输入格式
第一行两个整数一个 一个 , 代表有向图中有 个点, 代表有向图中有 条有向边。
接下来是 条边。
输出格式
输出每个点能够到达的最大编号
样例1输入
样例1输出
数据范围
点击查看代码
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <string.h>
using namespace std;
int n, m, fr, to;
int vis[100005 ];
vector<int > v[100005 ];
void dfs (int x, int y) {
for (int i = 0 ; i < v[x].size (); i ++) {
if (vis[v[x][i]]) continue ;
vis[v[x][i]] = y;
dfs (v[x][i], y);
}
return ;
}
int main () {
scanf ("%d %d" , &n, &m);
while (m --) {
scanf ("%d %d" , &fr, &to);
v[to].push_back (fr);
}
for (int i = n; i >= 1 ; i --)
if (!vis[i]) vis[i] = i, dfs (i, i);
for (int i = 1 ; i <= n; i ++) printf ("%d " , vis[i]);
return 0 ;
}
编译结果
compiled successfully
time: 328 ms, memory: 8272 kb, score: 100 , status: Accepted
> test 1 : time: 0 ms, memory: 5976 kb, points: 10 , status: Accepted
> test 2 : time: 39 ms, memory: 8168 kb, points: 10 , status: Accepted
> test 3 : time: 38 ms, memory: 8008 kb, points: 10 , status: Accepted
> test 4 : time: 24 ms, memory: 7392 kb, points: 10 , status: Accepted
> test 5 : time: 40 ms, memory: 8272 kb, points: 10 , status: Accepted
> test 6 : time: 30 ms, memory: 7500 kb, points: 10 , status: Accepted
> test 7 : time: 40 ms, memory: 8220 kb, points: 10 , status: Accepted
> test 8 : time: 35 ms, memory: 7924 kb, points: 10 , status: Accepted
> test 9 : time: 36 ms, memory: 8112 kb, points: 10 , status: Accepted
> test 10 : time: 46 ms, memory: 8252 kb, points: 10 , status: Accepted
时间:1s 空间:512M
题目描述
小埋最近在学习图相关知识,平时做的一些题目都是没有环的情况,现在小埋遇到了一个关于图的环的问题,
问题描述是有一个含 个顶点的双向图,每对顶点最多通过一条边连接,让小埋找到图中的最短的环的长度,
如果不存在环的话,就输出 -1
。
环是指以同一节点开始和结束,并且路径中的每条边仅使用一次。
题目输入
第一行是两个整数 , 代表该图有 个节点, 的话代表有 条双向边。
题目输出
输出一个整数是该图中的最小环的长度。
样例1输入
样例1输出
样例2输入
样例2输出
数据范围
, , ,
不存在重复的边
点击查看代码
using namespace std;
int n, m, ans = 0x3f3f3f3f ;
int vis[1005];
vector<int> v[1005];
void bfs(int x) {
memset(vis , 0 , sizeof vis);
queue<int> q;
q.push(x);
q.push(0);
while(!q.empty()) {
int u , f;
u = q.front(); q.pop();
f = q.front(); q.pop();
for(int i = 0 ; i < v [u ].size(); i ++) {
if(v [u ][i ] != f) {
if(vis [v [u ][i ]] != 0 && vis [v [u ][i ]] + vis [u ] + 1 != 2 && vis [v [u ][i ]] + vis [u ] + 1 <= n)
ans = min(ans , vis [v [u ][i ]] + vis [u ] + 1 );
else {
vis [v [u ][i ]] = vis [u ] + 1 ;
q.push(v [u ][i ]);
q.push(u);
}
}
}
}
}
int main() {
cin >> n >> m;
for(int i = 1 ; i <= m; i ++) {
int fr , to;
cin >> fr >> to;
v [fr ].push_back(to);
v [to ].push_back(fr);
}
for(int i = 1 ; i <= n; i ++) {
//memset(vis , 0 , sizeof vis);
bfs(i);
}
if(ans == 0x3f3f3f3f ) cout << "-1\n" ;
else cout << ans << endl;
return 0 ;
}
编译结果
compiled successfully
time: 92ms, memory: 3536kb, score: 100 , status: Accepted
> test 1: time: 6ms, memory: 3340kb, points: 10 , status: Accepted
> test 2: time: 2ms, memory: 3464kb, points: 10 , status: Accepted
> test 3: time: 18ms, memory: 3448kb, points: 10 , status: Accepted
> test 4: time: 8ms, memory: 3472kb, points: 10 , status: Accepted
> test 5: time: 11ms, memory: 3424kb, points: 10 , status: Accepted
> test 6: time: 0ms, memory: 3536kb, points: 10 , status: Accepted
> test 7: time: 12ms, memory: 3432kb, points: 10 , status: Accepted
> test 8: time: 7ms, memory: 3480kb, points: 10 , status: Accepted
> test 9: time: 13ms, memory: 3384kb, points: 10 , status: Accepted
> test 10: time: 15ms, memory: 3472kb, points: 10 , status: Accepted
时间:1s 空间:512M
题目描述
小埋最近在学习关于图相关的一些知识,现在小埋遇到了这样一个问题,给我们一个整数 ,
表示一张无向图中有 个节点,编号为 。然后输入一个 ,然后有 条双向边,每次输入两个整数
代表 之间有一条双向边,现在想要知道所有无法互相到达的不同的点对数目。
无法互相到达的意思是, 点不能到达 点, 不能到达 点。
题目输入
输入一行有两个整数
以下 行,每行两个整数, 两条边。
题目输出
输出一个整数,代表相互不能到达的点对数。
样例1输入
样例1输出
样例2输入
样例2输出
数据范围
, 。
不会有重复边
样例二的图如下。
点击查看代码
using namespace std;
long long n, m, num[100005], ans = 0 , cnt = 0 ;
bool vis[100005];
vector<int> v[100005];
void dfs(int t, int x) {
vis [x ] = true ;
for(int i = 0 ; i < v [x ].size(); i ++) {
if(vis [v [x ][i ]]) continue;
num [t ]++;
dfs(t , v [x ][i ]);
}
return;
}
int main() {
cin >> n >> m;
for(int i = 1 ; i <= m; i ++) {
int fr , to;
cin >> fr >> to;
v [fr ].push_back(to);
v [to ].push_back(fr);
}
for(int i = 1 ; i <= n; i ++) {
if(!vis [i ]) {
num [cnt + 1 ] = 1 ;
dfs(++cnt , i);
}
}
for(int i = 1 ; i <= cnt; i ++) {
ans += num [i ] * (n - num [i ]);
}
cout << ans / 2 << endl;
return 0 ;
}
编译结果
compiled successfully
time: 239ms, memory: 8140kb, score: 100 , status: Accepted
> test 1: time: 28ms, memory: 8008kb, points: 10 , status: Accepted
> test 2: time: 18ms, memory: 7184kb, points: 10 , status: Accepted
> test 3: time: 34ms, memory: 8140kb, points: 10 , status: Accepted
> test 4: time: 35ms, memory: 8048kb, points: 10 , status: Accepted
> test 5: time: 2ms, memory: 5788kb, points: 10 , status: Accepted
> test 6: time: 19ms, memory: 6928kb, points: 10 , status: Accepted
> test 7: time: 35ms, memory: 7500kb, points: 10 , status: Accepted
> test 8: time: 17ms, memory: 7084kb, points: 10 , status: Accepted
> test 9: time: 22ms, memory: 7408kb, points: 10 , status: Accepted
> test 10: time: 29ms, memory: 8052kb, points: 10 , status: Accepted
行 改为 ,结果不会有影响。
题解
改了之后,唯一有影响的就是单调递增序列, 了,但由于这种序列不需要位移,最后答案仍然为
数组元素大小单调时,输出结果一定不为 。
此类排序方法是高效的但是不稳定。
大整数开方: 输入一个正整数 ,试用二分法计算它的平方根的整数部分。
第一空填 ()
A. ans.num[j - 1]
B . ans.num[i + j - 1]
C. ans.num[i + j]
D. ans.num[i - j - 1]
输入“25”,输出为()。
A . 1
B. 2
C. 3
D. 4
程序使用了 算法。
若输入 ,则输出( )个元素。
A.
B .
C.
D.
若输出 ,则输出( ) 个元素。
A.
B.
C.
D .
过河问题: 在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸。在这伸手不见五指的黑夜里,过桥时必须借助灯光来照明,很不幸的是,他 们只有一盏灯。另外,独木桥上最多承受两个人同时经过,否则将会坍塌。每个人单独过桥 都需要一定的时间,不同的人需要的时间可能不同。两个人一起过桥时,由于只有一盏灯, 所以需要的时间是较慢的那个人单独过桥时所花的时间。现输入 和这 个 人单独过桥时需要的时间,请计算总共最少需要多少时间,他们才能全部到达河的左岸。 例如,有 个人甲、乙、丙,他们单独过桥的时间分别为 ,则总共最少需要 的时间为 。具体方法是:甲、乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然 后甲、丙再一起过桥到河的左岸,总时间为 。
(2)处应填()。
A.
B .
C.
D.
(5)处应填()。
A.
B.
C .
D.
程序的时间复杂度为多项式级别。
此程序的时间复杂度是( )
A.
B .
C.
D.
字符串合并: 给你两个字符串 ,是否能不改变 字符串原有顺序合成 。
例如:
输入:lab tree latrbee
输出:Yes
输入:lab tree laterbe
输出:No
① 处应填( )。
A .
B.
C.
D.
设某强连通图中有 个顶点,则该强连通图中至少有( )条边
A.
B.
C .
D.
假设线性表的长度为 ,则在最坏情况下,冒泡排序需要的比较次数为
A.
B.
C.
D .
如果用一个字节来表示整数,最高位用作符号位,其他位表示数值。例如: 表示 , 表示 ,试问这样表示法的整数A的范围应该是()
A.
B.
C.
D.
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)