0%

第一届ACC杯(AcWing Cup)全国高校联赛

第一届ACC(AcWing Cup)全国高校联赛

Acwing举办的高校联赛比赛

Rank(1381/7567) 过题2/3

题目A

十六进制是一种基数为 1616 的计数系统,是一种逢 1616 进 11 的进位制。

通常用数字 0、1、2、3、4、5、6、7、8、90、1、2、3、4、5、6、7、8、9 和字母 A、B、C、D、E、FA、B、C、D、E、F 表示,其中: A∼FA∼F 表示 10∼1510∼15,这些称作十六进制数字。

观察这些数字的图案,我们可以发现,有些数字上面包含圈圈,具体来说:

  • 数字 0,4,6,9,A,D0,4,6,9,A,D 中包含一个圈。
  • 数字 8,B8,B 中包含两个圈。
  • 数字 1,2,3,5,7,C,E,F1,2,3,5,7,C,E,F 中不含圈。

现在,给定一个十进制整数 nn,请你将其转化为十六进制表示,并数一数其十六进制表示中一共含有多少个圈圈。

输入格式

一个整数 nn。

输出格式

一个整数,表示整数 nn 的十六进制表示包含的圈圈总数。

数据范围

前三个测试点满足 0≤n≤1000≤n≤100,
所有测试点满足 0≤n≤2×1090≤n≤2×109。

输入样例1:

1
11

输出样例1:

1
2

输入样例2:

1
14

输出样例2:

1
0

简单模拟即可 注意特判0 每次都在这里栽跟头…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// package com.ACC;

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
long ans = 0;
if(n == 0) System.out.println(1);
else{while(n > 0)
{
long m = n% 16;
// System.out.println(m);
if(m == 0|| m == 4 || m == 6 || m==9 || m== 10||m == 13) ans++;
else if(m == 8 || m == 11) ans +=2;
n = n / 16;
}
System.out.println(ans);
}
}
}

题目B

农夫约翰有 nn 片连续的农田,编号依次为 1∼n1∼n。

其中有 kk 片农田中装有洒水器。

装有洒水器的农田的编号从小到大依次为 x1,x2,…,xkx1,x2,…,xk。

在某个炎热的中午,约翰觉得是时候给他的所有农田浇水了。

每个洒水器在打开以后,向两侧方向洒水,并且随着开启时间延长,有效覆盖距离也不断增长。

具体来说,我们将第 xixi 片农田中的洒水器打开,经过 11 秒后,第 xixi 片农田被其覆盖,经过 22 秒后,第 [xi−1,xi+1][xi−1,xi+1] 片农田被其覆盖,经过 jj 秒后,第 [xi−(j−1),xi+(j−1)][xi−(j−1),xi+(j−1)] 片农田被其覆盖。

注意,每个洒水器的有效覆盖距离在每经过整数秒后,才会有所增长。

例如,经过 2.52.5 秒后,被第 xixi 片农田中的洒水器覆盖的农田仍是第 [xi−1,xi+1][xi−1,xi+1] 片农田,而不是第 [xi−1.5,xi+1.5][xi−1.5,xi+1.5] 片农田。

现在,约翰将所有洒水器同时打开,请问经过多少秒后,所有农田均被灌溉。

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

每组数据第一行包含两个整数 n,kn,k。

第二行包含 kk 个整数 x1,x2,…,xkx1,x2,…,xk。

输出格式

每组数据输出一行答案。

数据范围

前三个测试点满足 1≤n≤51≤n≤5,
所有测试点满足 1≤T≤2001≤T≤200,1≤n≤2001≤n≤200,1≤k≤n1≤k≤n,1≤xi≤n1≤xi≤n,xi−1<xixi−1<xi,TT 组数据的 nn 相加之和不超过 200200。

输入样例:

1
2
3
4
5
6
7
3
5 1
3
3 3
1 2 3
4 1
1

输出样例:

1
2
3
3
1
4

模拟即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// package com.ACC;

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
int[] n = new int[T];
int[] k = new int[T];
for (int i = 0; i < T; i++) {
n[i] = scanner.nextInt();
k[i] = scanner.nextInt();
int[] a = new int[k[i]];
for (int j = 0; j < k[i]; j++) {
a[j] = scanner.nextInt();
}
int q = n[i] - a[k[i] -1]+1;
int ans = Math.max(a[0],q);
if(k[i] == 1) ans =Math.max(a[0],n[i] - a[0]+1);
else {
for (int j = 0; j + 1 < k[i]; j++) {
ans = Math.max(ans, (a[j + 1] - a[j]+2)/2);
}
}
System.out.println(ans);
}
}
}

题目C