更新时间:2023.03.18
当前结果
题目地址:首页 - 计算机软件能力认证考试系统
注意:想直接运行需要把下列代码class名和main函数改成Main再加入即可
如此编码
思路
按题目模拟填充数据
按照提示算出每个和项中的b输出即可
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
new Main().solution();
}
private void solution() {
init();
print();
}
private void print() {
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
sb.append(b[i]).append(" ");
}
System.out.println(sb);
}
private int n, m;
private int[] a, b, c, mo;
private void init() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
a = new int[n + 1];
c = new int[n + 1];
c[0] = 1;
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
c[i] = c[i - 1] * a[i];
}
b = new int[n + 1];
mo = new int[n];
mo[0] = m % c[1];
b[1] = mo[0] / c[0];
for (int i = 1; i < n; i++) {
mo[i] = m % c[i + 1] - mo[i - 1];
b[i + 1] = mo[i] / c[i];
}
}
}
何以包邮?
思路
枚举:70%
背包问题
既然不能通过枚举所有的情况来找到答案 ,那肯定是有一种途径来找到最优解,所以自然的联想到了dp(动态规划);我们再来看一下这个问题,寻找超过包邮条件x的最小数字组合。可以转化为先求书的总价sum,再用sum减去x得y,问题就变成了寻找不超过y(达到包邮条件)的最大数字组合,再用总价减去这个数字组合,即可得到最终答案。寻找不超过y的最大数字组合,这种类型就是典型的背包问题。这里,我们来简单回顾一下背包问题的几个核心思想:
子问题:当前背包容量j,前i个物品最佳组合对应的价值
递推关系式:v[i]:各商品价值 w[i]:各商品重量 (这里书的重量就是它的价值)
j<w[i]: dp[i][j]=dp[i-1][j]
j>w[i]: dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
参考:CSP-何以包邮?(从背包问题的角度出发)_何以包邮?_CXR_XC的博客-优快云博客
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
new Main().solution();
}
private void solution() {
init();
bag();
print();
}
private void bag() {
for (int i = 1; i <= n; i++) {// 遍历前i个物品
for (int j = 1; j <= y; j++) {// 遍历容量
if (a[i] > j) {// 如果当前物品的容量比容量大,肯定不能放入背包
dp[i][j] = dp[i - 1][j];
} else {// 放入背包或者不放入,看哪个价值大
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - a[i]] + a[i]);
}
}
}
}
private void print() {
System.out.println(sum - dp[n][y]);
}
private int n, x, sum, y;
private int[] a;
private int[][] dp;
private void init() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
x = sc.nextInt();
a = new int[n + 1];
sum = 0;
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
sum += a[i];
}
y = sum - x;
// 转换为物品的价格为不超过y的最大情况
dp = new int[n + 1][y + 1];
}
}
防疫大数据
思路
模拟
模块化记录每天情况
每收到一个风险地区则更新后续日期的风险地区
注意数据去重处理(set)
处理数据时按照风险名单判定来处理
代码
public static void main(String[] args) {
new fydsj20220903().solution();
}
private void solution() {
init();
deal();
print();
}
private void deal() {
for (int d = 0; d < n; d++) {
Set<Integer> dangers = data[d].dangers;// 当日风险名单
for (int d0 = Math.max(d - 6, 0); d0 <= d; d0++) {// 遍历前面日期
a:
for (int[] mm : data[d0].ms) {
int d1 = mm[0], u = mm[1], r = mm[2];
if (dangers.contains(u)) continue;
if (d1 > d - 7 && d1 <= d && d1 >= 0) {// 满足一号条件
// 注意如果此处d1<0则必存在无记录情况,则不满足二号条件
boolean isDanger = true;
// 注意此处d1可能小于0
for (int D = d1; D <= d && isDanger; D++) {
if (!data[D].p.contains(r)) {
isDanger = false;
}
}
if (isDanger) dangers.add(u);// 二号条件
}
}
}
}
}
private void print() {
for (int i = 0; i < n; i++) {
StringBuilder sb = new StringBuilder();
sb.append(i).append(' ');
Set<Integer> dangers = data[i].dangers;
// 排序
int[] us = new int[dangers.size()];
int index = 0;
for (int u : dangers) {
us[index++] = u;
}
Arrays.sort(us);
for (int u : us) {
sb.append(u).append(' ');
}
System.out.println(sb);
}
}
private int n;
private Data[] data;
class Data {
int r, m;
Set<Integer> p;// 当天的风险地区
int[][] ms;
Set<Integer> dangers;// 去重
public Data() {
dangers = new HashSet<>();
p = new HashSet<>();
}
}
private void init() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
data = new Data[n];
for (int i = 0; i < n; i++) {
data[i] = new Data();
}
for (int i = 0; i < n; i++) {
int r = sc.nextInt(), m = sc.nextInt();
// 收到风险地区,更新后续日期风险地区
for (int j = 0; j < r; j++) {
int dangerR = sc.nextInt();
for (int z = i; z < n && z <= i + 6; z++) {
data[z].p.add(dangerR);
}
}
// 日期 用户 地区
int[][] ms = new int[m][3];
for (int j = 0; j < m; j++) {
ms[j][0] = sc.nextInt();
ms[j][1] = sc.nextInt();
ms[j][2] = sc.nextInt();
}
data[i].r = r;
data[i].m = m;
data[i].ms = ms;
}
}
}
吉祥物投票
思路
代码