m > \frac{n(n-1)}{2}
m>2n(n−1),就一定会出现重边或自环,不满足题目要求。所以当
m
n
(
n
−
1
)
2
m > \frac{n(n-1)}{2}
m>2n(n−1) 时,一定不存在合法方案。
综上所述,我们只需要判断
m
m
m 是否满足
n
−
1
≤
m
≤
n
(
n
−
1
)
2
n-1 \leq m \leq \frac{n(n-1)}{2}
n−1≤m≤2n(n−1),如果满足,就输出 “YES”,否则输出 “NO”。
时间复杂度
O
(
T
)
O(T)
O(T),空间复杂度
O
(
1
)
O(1)
O(1)。
参考代码
- Python
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
if n <= m + 1 and m <= n \* (n - 1) // 2:
print("YES")
else:
print("NO")
- Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0) {
int n = sc.nextInt();
int m = sc.nextInt();
if (n - 1 <= m && m <= n \* (n - 1) / 2) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}
- Cpp
#include <iostream>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, m;
cin >> n >> m;
if (n - 1 <= m && m <= n \* (n - 1) / 2) {
cout << "YES\n";
} else {
cout << "NO\n";
}
}
return 0;
}
02.K小姐的植物大战僵尸
问题描述
K小姐正在玩一款类似植物大战僵尸的游戏。在游戏中,有
n
n
n 只僵尸排成一列向K小姐的家园前进。初始时,第
i
i
i 只僵尸的生命值为
a
i
a_i
ai。
K小姐可以进行
m
m
m 次攻击。每次攻击,K小姐可以选择
k
k
k 只相邻的僵尸,使它们的生命值都减少
1
1
1。
K小姐想知道,在进行
m
m
m 次攻击之后,生命值最大的僵尸最少能有多少生命值。
输入格式
第一行包含三个正整数
n
,
m
,
k
n, m, k
n,m,k,分别表示僵尸的数量、攻击次数和每次攻击能选择的相邻僵尸数量。
第二行包含
n
n
n 个正整数
a
1
,
a
2
,
…
,
a
n
a_1, a_2, \ldots, a_n
a1,a2,…,an,表示初始时每只僵尸的生命值。
输出格式
输出一个整数,表示在
m
m