小明要用二进制来表示 1 到 10000 的所有整数,要求不同的整数用不同的二进制数表示,请问,为了表示 1 到 10000 的所有整数,至少需要多少个二进制位?
解答:
2^13=8192
2^14=16384
2^ 14 >10000了,此时有15位(因为最右边是2^0开始的)
也就是说:14位就可以表示1~2^14-1
所以14位就已经足够表示
答案提交:14
请问在 1 到 2020 中,有多少个数既是 4 的整数倍,又是 6 的整数倍。
答案提交:168
一个无向图包含 2020 条边,如果图中没有自环和重边,请问最少包含多少个结点?
答案提交:
对于这个问题,就是找出一个最小的n,让它满足n*(n - 1) / 2 >= 2020
不够4040,所以只能取65!
运算过程可能出现小数,但是因为整数的性质,直接去掉了后面的小数,记得验证一下
补充:
一个无向图(没有自环和重边),最多包含n * (n-1)/2条边,最少包含n-1条边。
请问有多少个序列满足下面的条件:
1. 序列的长度为 5。
2. 序列中的每个数都是 1 到 10 之间的整数。
3. 序列中后面的数大于等于前面的数。
public class 序列 {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
for (int k = 1; k <= 10; k++) {
for (int m = 1; m <= 10; m++) {
for (int n = 1; n <= 10; n++) {
if (i <= j && j <= k && k <= m && m <= n) {
String temp = i + "" + j + "" + k + "" + m + "" + n;
set.add(temp);
}
}
}
}
}
}
System.out.println(set.size());
}
}
答案提交:2002
两个字母之间的距离定义为它们在字母表中位置的距离。例如 A 和 C 的距离为 2,L 和 Q 的距离为 5。
对于一个字符串,我们称字符串中两两字符之间的距离之和为字符串的内部距离。
例如:ZOO 的内部距离为 22,其中 Z 和 O 的距离为 11。
请问,LANQIAO 的内部距离是多少?
public class 字母间距 {
public static void main(String[] args) {
String s = "LANQIAO";
char[] cs = s.toCharArray();
int len = 0;
for (int i = 0; i < cs.length; i++) {
for (int j = i + 1; j < cs.length; j++) {
len += (int) Math.abs(cs[j] - cs[i]);
}
}
System.out.println(len);
}
}
答案提交:162
问题描述
现在时间是 a 点 b 分,请问 t 分钟后,是几点几分?
输入格式
输入的第一行包含一个整数 a。
第二行包含一个整数 b。
第三行包含一个整数 t。
输出格式
输出第一行包含一个整数,表示结果是几点。
第二行包含一个整数,表示结果是几分。
样例输入1
3
20
165
样例输出1
6
5
样例输入2
3
20
175
样例输出2
6
15
数据规模和约定
对于所有评测用例,0 <= a <= 23, 0 <= b <= 59, 0 <= t, t 分钟后还是在当天。
public class Time {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int t = sc.nextInt();
// a点b分, t分钟后,是几点几分
// 边界情况:(1)b+t>=60(2)当a=23时,应该注意是否到达第二天
// 且b 可能很大!所以应该用/和 %来找到正确的时间
int m = b + t;
if (m >= 60) {
a += m / 60;
m = m % 60;
}
a = a % 24;//虽然题上告诉了,当天,但是针对不是当天的情况,记得a%24
System.out.println(a);
System.out.println(m);
}
}
7、平行四边形:底*高
8.
问题描述
小蓝有一张黑白图像,由 n * m 个像素组成,其中从上到下共 n 行,每行从左到右 m 列。每个像素由一个 0 到 255 之间的灰度值表示。
现在,小蓝准备对图像进行模糊操作,操作的方法为:
对于每个像素,将以它为中心 3 * 3 区域内的所有像素(可能是 9 个像素或少于 9 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。
请注意每个像素都要用原图中的灰度值计算求和。
输入格式
输入的第一行包含两个整数 n, m。
第 2 行到第 n + 1 行每行包含 m 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。
输出格式
输出 n 行,每行 m 个整数,相邻整数之间用空格分隔,表示模糊后的图像。
样例输入
3 4
0 0 0 255
0 0 255 0
0 30 255 255
样例输出
0 42 85 127
5 60 116 170
7 90 132 191
数据规模和约定
对于所有评测用例,1 <= n, m <= 100。
public class 图像 {
// 上,下,左,右,左上,右上,左下 ,右下
static int[] dirX = { -1, 1, 0, 0, 1, 1, -1, -1 };
static int[] dirY = { 0, 0, -1, 1, -1, 1, -1, 1 };
static int n;
static int m;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();// 行
m = scanner.nextInt();// 列
int[][] a = new int[n][m];
int[][] copy = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
a[i][j] = scanner.nextInt();
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
copy[i][j] = f(a, i, j, 1, a[i][j]);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(copy[i][j] + " ");
}
System.out.println();
}
}
public static int f(int[][] a, int row, int col, int cnt, int sum) {
for (int i = 0; i < dirX.length; i++) {
int x = row + dirX[i];
int y = col + dirY[i];
if (x < 0 || y < 0 || x >= n || y >= m) {
continue;
}
cnt++;
sum += a[x][y];
}
return sum / cnt;
}
}
问题描述
小蓝负责花园的灌溉工作。
花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。
小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。
每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。
给定花园水管的位置,请问 k 分钟后,有多少个方格被灌溉好?
输入格式
输入的第一行包含两个整数 n, m。
第二行包含一个整数 t,表示出水管的数量。
接下来 t 行描述出水管的位置,其中第 i 行包含两个数 r, c 表示第 r 行第 c 列有一个排水管。
接下来一行包含一个整数 k。
输出格式
输出一个整数,表示答案。
样例输入
3 6
2
2 2
3 4
1
样例输出
9
样例说明
用1表示灌溉到,0表示未灌溉到。
打开水管时:
000000
010000
000100
1分钟后:
010000
111100
011110
共有9个方格被灌溉好。
数据规模和约定
对于所有评测用例,1 <= n, m <= 100, 1 <= t <= 10, 1 <= k <= 100。
public class 花园灌溉 {
static int[][] grid;
static boolean[][] flag;
static int n;
static int m;
static int[][] dir = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
grid = new int[n][m];
flag = new boolean[n][m];
int t = scanner.nextInt();// 水管的数量
for (int i = 0; i < t; i++) {
int row = scanner.nextInt() - 1;
int col = scanner.nextInt() - 1;
grid[row][col] = 1;
}
int k = scanner.nextInt();// K分钟
int time = 1;
int ans = t;
while (time <= k) {
flag = new boolean[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1 && !flag[i][j]) {
flag[i][j] = true;
ans += f(grid, i, j, 0);
}
}
}
time++;
// for (int i = 0; i < grid.length; i++) {
// System.out.println(Arrays.toString(grid[i]));
// }
}
System.out.println(ans);
}
public static int f(int[][] grid, int row, int col, int cnt) {
for (int i = 0; i < 4; i++) {
int x = row + dir[i][0];
int y = col + dir[i][1];
if (x < 0 || y < 0 || x >= n || y >= m) {
continue;
}
if (grid[x][y] != 1 && !flag[x][y]) {
flag[x][y] = true;
grid[x][y] = 1;
cnt++;
}
}
return cnt;
}
}
最后一题需要dp,不会,end.