Educational Codeforces Round 74 (Rated for Div. 2)
# | 题目 | 分数 | 是否AC |
---|---|---|---|
A | Prime Subtraction | 900 | ✅ |
B | Kill 'Em All | 1300 | ✅ |
C | Standard Free2play | 1600 | ✅ |
D | AB-string | 1900 | ❌ |
E | Keyboard Purchase | 2200 | ❌ |
F | The Maximum Subtree | 2200 | ❌ |
G | Adilbek and the Watering System | 2700 | ❌ |
A. Prime Subtraction
题目类型 数论
题意
输入两个整数 x x x、 y y y,然后判断是否可以使 x x x 减去一个素数任意次使 x x x 最终等于 y y y。
分析
因为除 1 外的所有非负数不是素数就是素数的倍数,所有判断 x − y x - y x−y 是否等于 1 即可。
代码
public static void solve() throws IOException {
long x = nextLong();
long y = nextLong();
if (x - y == 1) pw.println("NO");
else pw.println("YES");
}
B. Kill 'Em All
题目类型 贪心
题意
在水平坐标轴上有一些怪物,可以通过炸弹消灭它们(直接炸死或将其推倒负半轴)。在坐标 x x x 处放一个炸弹:
- 使点 x x x 处的怪物直接被消灭
- 将 x x x 左边所有的怪物向左推动,使其坐标变为 x − r x - r x−r
- 将 x x x 右边所有的怪物向右推动,使其坐标变为 x + r x + r x+r
求将所有怪物消灭至少需要多少炸弹。
分析
因为安放一个炸弹只会消灭其安放位置处的怪物和其左边被推进负半轴的怪物。所以每次选择在最右边未被消灭的怪物处安放炸弹。
代码
public static void solve() throws IOException {
int n = nextInt();
int r = nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = nextInt();
shuffle(a);
Arrays.sort(a);
HashSet<Integer> set = new HashSet<>();
int x = 0;
int ans = 0;
for (int i = n - 1; i >= 0; i--) {
if (!set.contains(a[i])) {
set.add(a[i]);
if (a[i] - x > 0) {
x += r;
ans++;
}
}
}
pw.println(ans);
}
public static void shuffle(int[] a) {
for (int i = 0, len = a.length; i < len; i++) {
int rand = (int) (Math.random() * len);
int temp = a[rand];
a[rand] = a[i];
a[i] = temp;
C. Standard Free2play
题目类型 贪心 数学
题意
在一个高度为 h h h 的悬崖上有 n n n 个台阶(伸出来),当从高度为 x x x 的台阶向下跳时 x x x 处的台阶会隐藏, x − 1 x - 1 x−1 处的台阶会改变其状态:
- 如果 x − 1 x - 1 x−1 处的台阶是伸出来的,则它会被隐藏
- 如果 x − 1 x - 1 x−1 处的台阶是隐藏的,则它会伸出
起初人物是站在高度为 h h h 处,人物每次最多只能跳到 x − 1 x - 1 x−1 或 x − 2 x - 2 x−2 处(且此处有台阶),否则就会摔死。人物可以通过花费 1 1 1 宝石,来改变除第 h h h 处的台阶外其它所有台阶的状态。求人物最终落到 0 0 0 处的最小花费。
分析
如果
x
−
1
x - 1
x−1 处的台阶是伸出来的,则下落时会隐藏,此时需要判断
x
−
2
x - 2
x−2 处的台阶是否是伸出来的如果不是伸出来的则需要花费
1
1
1 宝石来改变它的状态否则直接落到
x
−
2
x - 2
x−2 处。
如果
x
−
1
x - 1
x−1 处的台阶是隐藏的,则下落时会伸出,此时可以直接落到
x
−
1
x - 1
x−1 处。
代码
static TreeSet<Integer> set;
static int ans;
public static void solve() throws IOException {
int h = nextInt();
int n = nextInt();
ans = 0;
set = new TreeSet<>();
for (int i = 0; i < n; i++) set.add(nextInt());
set.add(0);
fun(h);
pw.println(ans);
}
public static void fun(int h) {
if (h <= 2) return ;
int H = set.lower(h);
if (h - H == 1) {
set.remove(H);
if (h - set.lower(h) > 2) ans++;
fun(h - 2);
} else {
fun(H + 1);
}
}