Educational Codeforces Round 74 (Rated for Div. 2)

Educational Codeforces Round 74 (Rated for Div. 2)

原题地址

#题目分数是否AC
APrime Subtraction900
BKill 'Em All1300
CStandard Free2play1600
DAB-string1900
EKeyboard Purchase2200
FThe Maximum Subtree2200
GAdilbek and the Watering System2700





A. Prime Subtraction

题目类型 数论

题意

  输入两个整数 x x x y y y,然后判断是否可以使 x x x 减去一个素数任意次使 x x x 最终等于 y y y



分析

  因为除 1 外的所有非负数不是素数就是素数的倍数,所有判断 x − y x - y xy 是否等于 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 处放一个炸弹:

  1. 使点 x x x 处的怪物直接被消灭
  2. x x x 左边所有的怪物向左推动,使其坐标变为 x − r x - r xr
  3. 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 x1 处的台阶会改变其状态:

  1. 如果 x − 1 x - 1 x1 处的台阶是伸出来的,则它会被隐藏
  2. 如果 x − 1 x - 1 x1 处的台阶是隐藏的,则它会伸出

起初人物是站在高度为 h h h 处,人物每次最多只能跳到 x − 1 x - 1 x1 x − 2 x - 2 x2 处(且此处有台阶),否则就会摔死。人物可以通过花费 1 1 1 宝石,来改变除第 h h h 处的台阶外其它所有台阶的状态。求人物最终落到 0 0 0 处的最小花费。



分析

  如果 x − 1 x - 1 x1 处的台阶是伸出来的,则下落时会隐藏,此时需要判断 x − 2 x - 2 x2 处的台阶是否是伸出来的如果不是伸出来的则需要花费 1 1 1 宝石来改变它的状态否则直接落到 x − 2 x - 2 x2 处。
  如果 x − 1 x - 1 x1 处的台阶是隐藏的,则下落时会伸出,此时可以直接落到 x − 1 x - 1 x1 处。



代码
    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);
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值