题 A

游游的7的倍数

游游拿到了一个正整数x,她希望在x中添加一个数字,使它成为7的倍数。你能帮帮她吗?

输入描述:

一个正整数x。
1 ≤ x ≤ 10^9

输出描述:

x添加一个数字后形成的数。请务必保证操作的合法性,且一定是7的倍数。如果有多解,输出任意一个合法解。可以证明,至少存在一个正确答案。

  • 案例
    1
    2
    3
    4
    输入
    1
    输出
    21

思路:每十个数里一定有至少一个7的倍数,因此枚举个位即可。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n = in.nextLong();
for (int i = 0; i < 10; i++) {
if( ( n * 10 + i ) % 7 == 0 ){
System.out.println(n * 10 + i);
break;
}
}
}
}

题 B

游游的字母串

对于一个小写字母而言,游游可以通过一次操作把这个字母变成相邻的字母。’a’和’b’相邻,’b’和’c’相邻,以比类推。特殊的,’a’和’Z也是相邻的。可以认为,小写字母的相邻规侧为一个环。游游拿到了一个仅包含小写字母的字符串,她想知道,使得所有字母都相等至少要多少次操作?

输入描述:

一个仅包含小写字母,长度不超过100000的字符串。

输出描述:

一个整数,代表最小的操作次数。

  • 案例
    1
    2
    3
    4
    5
    6
    7
    8
    输入
    yab
    输出
    3
    说明
    第一次操作,把'y'变成'z',字符串变成了"zab"
    第二次操作,把'b'变成'a',字符串变成了"zaa"
    第三次操作,把'z'变成'a',字符串变成了"aaa"

思路:枚举将字符串中的所有字符变成某个字母所需的步数,取最小值即可。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
int len = s.length();
int ans = Integer.MAX_VALUE;
for (int i = 0; i < 26; ++i) {
int cnt = 0;
for (int j = 0; j < len; j++) {
int tmp = Math.abs(s.charAt(j) - 'a' - i);
cnt += Math.min(tmp, 26 - tmp);
}
ans = Math.min(ans, cnt);
}
System.out.print(ans);
}
}

题 C

游游的水果大礼包

游游有个n苹果,m个桃子。她可以把2个苹果和1个桃子组成价值a元的一号水果大礼包,也可以把1个苹果和2个桃子组成价值b元的二号水果大礼包。游游想知道,自己最多能组成多少价值总和的大礼包?

输入描述:

四个正整数n,m,a,b用空格隔开。分别代表苹果的数量、桃子的数量、一号大礼包价值、二号大礼包价值。
1 ≤ n ,m ,a , b ≤ 10^9

输出描述:

一个整数,代表大礼包的最大价值总和。

  • 案例
    1
    2
    3
    4
    5
    6
    输入
    3 4 1 2
    输出
    4
    说明
    组成两个二号水果大礼包,使用了2个苹果和4个桃子。总价值为4。

思路:枚举第一个礼包打包的数量,那么第二个礼包打包的数量就可以算出来了。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n = in.nextInt();
long m = in.nextInt();
long a = in.nextInt();
long b = in.nextInt();

long ans = 0;
// 枚举一号大礼包
for(int i = 0 ; i <= Math.min(n / 2, m); i++ ){
long count = 0;
count = i * a + Math.min ( (n - 2*i) , (m - i)/2 ) * b;
ans = Math.max(count , ans);
}
System.out.println(ans);
}
}

题 D

游游的矩阵权值

游游定义一个矩阵权值为:每一对相邻元素之和的总和。
例如,对于短阵:
1 2
3 4
它的权值是(1+2)+(1+3)+(2+4)+(3+4)=3+4+6+7=20。
游游希望你构造一个n X n 的矩阵,矩阵中的元素为1到n^2且每个数恰好出现一次。
她希望最终矩阵的权值尽可能大。你能帮帮她吗?由于矩阵可能过大,你不需要输出最终的矩阵,只需要输出这个最大权值即可。答案对10e9十7取模。

输入描述:

一个正整数 n
2 <= n <= 10^9

输出描述:

矩阵权值的最大值,对10e9+7取模

  • 案例
    1
    2
    3
    4
    输入
    2
    输出
    20

思路:在矩阵角落的数字只会加两次,在边上的数字会加三次,在矩阵内部的数字会加四次。
这里可能需要费马小定律来求逆元


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
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n = in.nextLong();
int mod = 1000000007;
// 四个角的值
long part1 = 20;
// 边
long part2 = 4 * (n - 2) % mod * (5 + (4 + (4 * (n - 2)))) % mod * quick(2, mod - 2, mod) * 3 % mod;
// 内部
long part3 = ((n - 2) * (n - 2)) % mod * ((1 * n * n % mod + (5 + 4 * (n - 2))) * 2) % mod;
System.out.print( (part1+part2+part3)%mod );
}
//快速幂
public static long quick(long a , long k , int mod){
long ans = 1;
while(k != 0){
if( (k & 1) == 1 ){
ans = ans * a % mod;
}
a = a * a % mod;
k >>= 1;
}
return ans;
}
}