题解:CF1346E Magic Tricks
注意:此题只能用 Kotlin 语言提交。
所以这是一篇 Kotlin 的题解。
什么是 Kotlin?
Kotlin 是一种由 JetBrains 开发的现代编程语言,与 Java 兼容。
考虑到大部分人都用 C++ 写代码,这里主要将 Kotlin 和 C++ 作比较。
Kotlin 语法
1. 程序结构
fun main() {
...
}
也就是 main 函数。
2. 输入
使用 Java 的 Scanner 类从标准输入读取数据,并导入 java.util.Scanner。
在开头加上:
import java.util.Scanner
然后在 main 函数中初始化:
val scanner = Scanner(System.`in`)
之后读入 int 类型:
val a = scanner.nextInt()
其他类型同理,但字符串的读取方式略有不同:
val a = scanner.nextLine()
3. 输出
print():输出后不换行。println():输出后换行。
4. 变量声明
val:常量,相当于 C++ 中的const,但如果val定义的是数组,内部元素仍然可以改变。var:变量。
不管是 val 还是 var,都可以自动识别类型。
5. 数组
val a: Array<Int> = Array(n + 1) { m + 1 }
val a = IntArray(n + 1) { m + 1 }
以上两种方式都代表创建一个大小为 a[i] 表示数组
其他的数据类型同理。
6. 判断
if (....) {
....
}
与 C++ 一致。
7. 循环
-
for循环for (i in a) { println(i) }类似于 C++ 中的
auto。for (i in 1..n) { println(a[i]) }也可以通过
x..y遍历。 -
while循环while (true) { if (...) { break } } -
repeat循环repeat(m) { ... }表示循环执行
m 次括号内的语句。
8. 最大/最小值
val a = minOf(b,c)/maxOf(b,c)
基本与 C++ 一致。
下面来分析题目。
题意
给定
要求计算每个位置
思路
考虑动态规划,定义
假设第
对于其他位置,
由于
最终时间复杂度为
Code
import java.util.*
fun main(){
val scanner=Scanner(System.`in`);
val n=scanner.nextInt();
val m=scanner.nextInt();
val k=scanner.nextInt();
val dp=IntArray(n+1){m+1};
dp[k]=0;
repeat(m){
val a=scanner.nextInt();
val b=scanner.nextInt();
val aa=minOf(dp[a]+1,dp[b]);
val bb=minOf(dp[b]+1,dp[a]);
dp[a]=aa;
dp[b]=bb;
}
for(j in 1..n){
if(dp[j]>m){
print(-1);
}
else{
print(dp[j]);
}
print(" ");
}
println();
}