Java && C++ 实现第十二届蓝桥杯 C++ B组 F时间显示 G砝码称重

170 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

虽然是C++组的,但是和Java组的差不了两道题,大家都可以看一看 如有错误,还请佬 评论或私信指出(写的稍些急) 再也不肝博客了 /(ㄒoㄒ)/~~

(由于上传图片有限制,如果描述不清楚点击手写题解) 手写题解字丑,但是小编感觉会比文字看的直观一些(其实是不会用数学公式)

编程题测试数据

C++B组手写题解(如果访问出错,请刷新访问的页面即可(Nebo的问题))

当前页面的编程题均在C语言网成功运行 C语言网有各届蓝桥杯的题库 第十二届蓝桥杯编程题测试 刷题集

在这里插入图片描述

试题 F: 时间显示

时间限制: 1.0s

内存限制: 256.0MB

本题总分:15 分

【问题描述】

小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取

了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时

刻经过的毫秒数。

现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要

显示出时分秒即可,毫秒也不用显示,直接舍去即可。

给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

【输入格式】

输入一行包含一个整数,表示时间。

【输出格式】

输出时分秒表示的当前时间,格式形如 HH:MM:SS,其中 HH 表示时,值

为 0 到 23,MM 表示分,值为 0 到 59,SS 表示秒,值为 0 到 59。时、分、秒

不足两位时补前导 0。

【样例输入 1】

46800999

【样例输出 1】

13:00:00

【样例输入 2】

1618708103123

【样例输出 2】

01:08:23

【评测用例规模与约定】

对于所有评测用例,给定的时间为不超过 1018 的正整数。

package LanqiaobeiExam._12CB;

import java.util.Scanner;

/**
 * ClassName: F时间显示
 * Package: LanqiaobeiExam._12CB
 *
 * @DATE: 2022/3/21 20:18
 * Author: asleep
 */
public class F时间显示 {    //无需考虑天数,只要一天内的时间,直接取余算 时分秒 即可
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        n /= 1000;
        long second = n % 60;
        n /= 60;
        long minute = n % 60;
        n /= 60;
        long hour = n % 24;
        n /= 24;
        if (hour < 10) {
            System.out.print("0" + hour + ":");
        } else {
            System.out.print(hour + ":");
        }
        if(minute < 10) {
            System.out.print("0" + minute + ":");
        } else {
            System.out.print(minute + ":");
        }
        if (second < 10) {
            System.out.print("0" + second);
        } else {
            System.out.print(second);
        }
    }
}

试题 G: 砝码称重

时间限制: 1.0s

内存限制: 256.0MB

本题总分:20 分

【问题描述】

你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · , WN。

请你计算一共可以称出多少种不同的重量?

注意砝码可以放在天平两边。

【输入格式】

输入的第一行包含一个整数 N。

第二行包含 N 个整数:W1, W2, W3, · · · , WN。

【输出格式】

输出一个整数代表答案。

【样例输入】

3

1 4 6

【样例输出】

10

【样例说明】

能称出的 10 种重量是:1、2、3、4、5、6、7、9、10、11。

1 = 1;

2 = 6 − 4 (天平一边放 6,另一边放 4);

3 = 4 − 1;

4 = 4;

5 = 6 − 1;

6 = 6;

7 = 1 + 6;

9 = 4 + 6 − 1;

10 = 4 + 6;

11 = 1 + 4 + 6。

【评测用例规模与约定】

对于 50% 的评测用例,1 ≤ N ≤ 15。

对于所有评测用例,1 ≤ N ≤ 100,N 个砝码总重不超过 100000。

image.png

package LanqiaobeiExam._12CB;

import java.util.Scanner;

/**
 * ClassName: G砝码称重
 * Package: LanqiaobeiExam._12CB
 *
 * @DATE: 2022/3/21 20:33
 * Author: asleep
 */
public class G砝码称重 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] num = new int[n + 1];
        int sum = 0;
        for (int i = 1; i < n + 1; i++) {
            num[i] = sc.nextInt();
            sum += num[i];
        }
        boolean[][] dp = new boolean[101][100001];
        dp[0][0] = true;
        for (int i = 1; i < n + 1; i++) {
            for (int j = 0; j < sum + 1; j++) {
                dp[i][j] = dp[i - 1][j] || dp[i - 1][Math.abs(j - num[i])] || dp[i - 1][j + num[i]];
            }
        }
        int res = 0;
        for (int i = 1; i < sum + 1; i++) {
            if (dp[n][i]) {
                res++;
            }
        }
        System.out.println(res);


    }
}

#include "iostream"
#include "cmath"

using namespace std;

int num[101];
bool dp[101][100001];   //这里防止 j+num[i] 超过范围
int main() {
    int n;
    int sum = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> num[i];
        sum += num[i];
    }
    dp[0][0] = true;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= sum; j++) {
            dp[i][j] = dp[i - 1][j] || dp[i - 1][(int)fabs(j - num[i])] || dp[i - 1][j + num[i]];
        }
    }
    int res = 0;
    for (int i = 1; i<= sum; i++) {
        if (dp[n][i]) {
            res++;
        }
    }
    cout    << res;
    return 0;
}