首页 > 学院 > 开发设计 > 正文

SRM150_DIV2

2019-11-14 10:42:32
字体:
来源:转载
供稿:网友

继续继续~

250

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

public class FormatAmt { public String amount(int dollars, int cents) { return String.format("$%,d.%02d", dollars, cents); }}

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; }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表