📢📢📢时间过得真快,转眼间已经打卡二十天了,距离省赛也已经就剩不到半个月了,但是感觉自己还是有很多不足,一些题目不能独立完成,唉,还有点时间,加油吧💪
💌💌💌纸张尺寸💌💌💌
📋问题描述
样例输入1
A0
样例输出1
1189
841
样例输入 2
A1
样例输出 2
841
594
运行限制
最大运行时间:1s
最大运行内存: 512M
❓思路分享
📮题意很好理解,每次让长方形的长减半,A0就是不减半,A3就是减半三次。我们只需要在每次减半后更新长方形的长和宽即可(二者较长的为长,较短的为宽)。
📗参考代码
import java.util.Scanner;
/**
* @ClassName 纸张尺寸
* @Author @浅夜
* @Date 2023/3/23 16:34
* @Version 1.0
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int l = 1189;
int w = 841;
char[] c = sc.nextLine().trim().toCharArray();
for(char i = '0'; i < c[1];i++){
l/=2;
if(l < w) {
int t = l;
l = w;
w = t;
}
}
// System.out.println(c[1]);
System.out.println(l);
System.out.println(w);
}
}
👻👻👻最大数字👻👻👻
📋问题描述
样例输入
123 1 2
样例输出
933
样例说明
对百位数字执行 2 次 2 号操作, 对十位数字执行 1 次 1 号操作。
评测用例规模与约定
对于 30% 的数据, 1≤N≤100; 0≤A,B≤10。
对于 100% 的数据, 1≤N≤10^17;0≤A,B≤100
运行限制
最大运行时间:1s
最大运行内存: 512M
❓思路分享
📮我们要用两种有限次的操作使一个数变得尽可能大,一种操作是给某个数位加数字,另一种是给某个数位减数字。
📮那我们怎么样分配这两种操作才能使这个数尽可能大呢?
📮其实我们需要有一点贪心的思想:
对于加操作,我们尽可能加在最高位,即使加不到9,只要加在最高位,肯定是比加在任何低于最高的数位都要大的。
对于减操作,除非在限制次数内够减到9,否则我们宁可不减,因为如果减不到9,我们就让高的数位变小了,这样的话肯定不是我们期待的变化,继续在更低的数位判断就行。
📗参考代码
import java.io.*;
/**
* @ClassName 最大数字
* @Author @浅夜
* @Date 2023/3/23 19:15
* @Version 1.0
*/
public class 最大数字 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static int a, b, m;
static String n;
static long ans = 0;
public static void main(String[] args) throws IOException {
String[] s = br.readLine().split(" ");
n = s[0];
m = n.length();
a = Integer.parseInt(s[1]);
b = Integer.parseInt(s[2]);
dfs(0,0);
// out.println(ans);
out.flush();
}
//考虑第i位 v表示当前的值
static void dfs(int i, long v) {
if (i == m) {
ans = Math.max(ans, v);
return;
}
int c = n.charAt(i) - '0'; //c表示数位为i的数
//第一种操作 能加到9最好,加不到9也要加在高位
int g = Math.min(a, 9 - c); //不能超过次数限制
a -= g;
dfs(i + 1, v * 10 + c + g);
//回溯
a += g;
//第二种使用
if (b > c) { //看限制次数够不够减到9 只有在够减的时候才减 不够宁愿不减
b -= c + 1; //减到9
dfs(i + 1, v * 10 + 9);
//回溯
b += c + 1;
}
out.println(v);
}
}
🍕🍕🍕全排列的价值🍕🍕🍕
📋问题描述
样例输入 1
3
样例输出 1
9
样例输入 2
2022
样例输出 2
593300958
❓思路分享
这道题目需要手推公式,看了题解还是不太懂,太笨了😭
附:题解(执梗)
📗参考代码
import java.io.*;
/**
* @ClassName 全排列的价值
* @Author @浅夜
* @Date 2023/3/23 22:06
* @Version 1.0
*/
public class 全排列的价值 {
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static long[] f = new long[1000010];
static long[] g = new long[1000010];
static int MOD = 998244353;
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
f[1] = 0;
init(n);
for (int i = 2; i <= n; i++) {
f[i] = (f[i - 1] * i % MOD + (long) i * (i - 1) / 2 % MOD * g[i - 1] % MOD) % MOD;
}
out.println(f[n]);
out.flush();
}
static void init(int n) {
long h = 1;
for (int i = 1; i <= n; i++) {
h *= i;
h %= MOD;
g[i] = h;
}
}
}
📢今天还是太水了,感觉稍微难一点的题就不行了,唉,好慌啊,感觉自己好菜,开小灶加餐去了,大家也要加油奥~
有收获的同学可以点点赞奥😁