虽然赛前没怎么做题,但这次省赛给我的感觉是比上一次简单,至少最后两个题都可以拿到一部分分了,上一次这两题都没有提交!
以下是个人的题解(回忆版):
试题 A: 阶乘求和
思路:别被这么大的数字吓到,其实100的阶乘以后都有10+个0了,再大了对答案也没有影响。
答案:420940313
代码:
package com.czl;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long res = 0;
int mod = (int)1e9;
for(int i = 1; i <= 1000; i ++ ) {
long cur = 1;
for(int j = 1; j <= i; j ++ ) {
cur *= j;
cur %= mod;
}
res += cur;
res %= mod;
}
System.out.println(res);
}
}
试题 B: 幸运数字
思路:本题对于不熟悉进制的同学来说很难受,熟悉的话其实还是很简单的。
答案:215040
代码:
package com.czl;
import java.util.*;
public class Main {
static int get(int x, int p) {
int s = 0;
while(x > 0) {
s += x % p;
x /= p;
}
return s;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i = 1;
int cnt = 0;
while(cnt < 2023) {
if(i % get(i, 2) == 0 && i % get(i, 8) == 0 && i % get(i, 10) == 0 && i % get(i, 16) == 0) {
cnt ++ ;
System.out.println(cnt + " " + i);
}
i ++ ;
}
}
}
试题 C: 数组分割
思路:先判读数组A中奇数的个数,如果不是偶数,直接输出0;
试题 D: 矩形总面积
思路:暴力做的,感觉想拿满分会非常麻烦,暴力敲一遍就过去了,拿一半分得了。
代码:
package com.czl;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = 1010;
int s[][] = new int[N][N];
for(int ii = 0; ii < 2; ii ++ ) {
int x1 = sc.nextInt();
int y1 = sc.nextInt();
int x2 = sc.nextInt();
int y2 = sc.nextInt();
for(int i = x1 + 1; i <= x2; i ++ ) {
for(int j = y1 + 1; j <= y2; j ++ ) {
s[i][j] = 1;
}
}
}
int res = 0;
for(int i = 0; i < N; i ++ )
for(int j = 0; j < N; j ++ ) {
if(s[i][j] == 1) res ++ ;
}
System.out.println(res);
}
}
试题 E: 蜗牛
思路:一眼DP,比较简单的线性DP。
代码:
package com.czl;
import java.util.*;
public class Main {
static int N = 100010, INF = (int)1e9;
static double f[][] = new double[N][2];
static int lai[] = new int[N], song[] = new int[N], d[] = new int[N];
static double f(int x) { //lai -> song
if(lai[x] > song[x])
return (lai[x] - song[x]) / 1.3;
return (song[x] - lai[x]) / 0.7;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 1; i <= n; i ++ ) {
d[i] = sc.nextInt();
}
for(int i = 1; i <= n - 1; i ++ ) {
song[i] = sc.nextInt();
lai[i + 1] = sc.nextInt();
}
f[1][0] = d[1];
f[1][1] = INF;
for(int i = 2; i <= n; i ++ ) {
f[i][0] = Math.min(f[i - 1][0], f[i - 1][1] + lai[i - 1] / 1.3) + d[i] - d[i - 1];
f[i][1] = Math.min(f[i - 1][1] + f(i - 1), f[i - 1][0] + song[i - 1] / 0.7);
}
double res = Math.min(f[n][0], f[n][1] + lai[n] / 1.3);
System.out.printf("%.2f", res);
}
}
试题 F: 合并区域
试题 G: 买二赠一
试题 H: 合并石子
试题 I: 最大开支
试题 J: 魔法阵