SRM150_DIV2

继续继续~

250

遍历每一天,最后再完成剩下的,明白了一个最简单的向上取整方法,就是在原来的数基础上加上n-1

public class WidgetRepairs {
    public int days(int[] arrivals, int numPerDay) {
        int ans = 0;
        int sum = 0;
        for (int arrival : arrivals) {
            sum += arrival;
            if (sum > 0) {
                ans++;
                sum -= Math.min(numPerDay, sum);
            }
        }
        if (sum > 0) {
            ans += (sum + numPerDay - 1) / numPerDay;
        }
        return ans;
    }
}

500

关于进制的一道数学题,首先这个数肯定小于base(进制),大于进制的就能缩小,也就不能被自己整除。
判断是否符合的条件,就是取mod之后是否为1。数学证明很简单。翻译成自然逻辑就是:每次加上一个base数都会进一位这样数字的和会大1,所以加上一个base-1的数,数字的和就不变咯~

public class InterestingDigits {
    public int[] digits(int base) {
        int k = 0;
        for (int i = 2; i < base; i++) {
            if (base % i == 1) {
                k++;
            }
        }
        int[] ans = new int[k];
        k = 0;
        for (int i = 2; i < base; i++) {
            if (base % i == 1) {
                ans[k] = i;
                k++;
            }
        }
        return ans;
    }
}

1100

模拟小球在空间撞来撞去,下面算法比较好的几点,矩阵代表着坐标,一个砖块是2*2的坐标,只有中心点有状态。小球的碰撞判定也是按照中心点状态来算的。其次就是无解的判断。这个for循环蛮好的。
for (int seconds = 0, lastBreak = 0; seconds < lastBreak + 4 * height * width; seconds++)
就是如果小球用所有角度撞了所有位置,也没有新的破碎,那么就是无解了。传说中的鸽笼原理。

public class BrickByBrick {
    public int timeToClear(String[] map) {
        int height = 2 * map.length + 3, width = 2 * map[0].length() + 3;
        char[][] state = new char[2 * height + 3][2 * width + 3];
        for (int y = 0; y < height; y += 2) {
            for (int x = 0; x < width; x += 2) {
                state[y][x] = '#';
            }
        }
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[i].length(); j++) {
                state[2 * i + 2][2 * j + 2] = map[i].charAt(j);
            }
        }
        int bricks = 0;
        for (int y = 0; y < height; y+=2) {
            for (int x = 0; x < width; x+=2) {
                if (state[y][x] == 'B') {
                    bricks++;
                }
            }
        }

        int y = 1, x = 2, dx = 1, dy = 1;

        for (int seconds = 0, lastBreak = 0; seconds < lastBreak + 4 * height * width; seconds++) {
            if (y % 2 == 1) {
                if (state[y + dy][x] == 'B') {
                    state[y + dy][x] = '.';
                    dy *= -1;
                    bricks--;
                    lastBreak = seconds;
                    if (bricks == 0) {
                        return seconds;
                    }
                } else if (state[y + dy][x] == '#') {
                    dy *= -1;
                }
            } else {
                if (state[y][x + dx] == 'B') {
                    state[y][x + dx] = '.';
                    dx *= -1;
                    bricks--;
                    lastBreak = seconds;
                    if (bricks == 0) {
                        return seconds;
                    }
                } else if (state[y][x + dx] == '#') {
                    dx *= -1;
                }
            }
            y += dy;
            x += dx;
        }
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值