2024PDD第一套-三语言题解

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 笔试合集传送们 -> 🧷学长刷题笔记

🍒 本专栏已收集 140+ 套题 🍄 题面描述等均已改编,如果和你实际看到的题面描述不一样请理解,做法和题目本质基本不变。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞

alt

☀️ 01.汉堡王优惠活动

问题描述

K小姐最喜欢到多哆村的金哆炸鸡店吃汉堡,每个汉堡原价 元。为了回馈老顾客,炸鸡店开展了拼团活动:每找到一个朋友一起购买,就可以减少 元,但价格最低只能降到 元(否则就要亏本啦)。

现在 K小姐 手上有 元钱,同时有 个朋友也想吃汉堡。K小姐 想知道自己最多能买多少个汉堡,以及在买最多汉堡的情况下最少要花多少钱。

输入格式

第一行包含一个正整数 ,表示测试用例的数量。

接下来 行,每行包含两个正整数 ,分别表示 K小姐 的钱数以及一起购买汉堡的朋友数量。

输出格式

对于每组测试用例,输出一行,包含两个整数,分别表示 K小姐 能购买的最多汉堡数量,以及购买最多汉堡时最少需要花的钱数。

样例输入

3
100 0
20 18
5 3

样例输出

10 100
3 15
0 0

数据范围

题解

本题的关键是判断能够凑成多少个优惠价 元的汉堡。

首先,我们可以计算出朋友数量可以凑成的 元汉堡个数 ,以及凑成这些汉堡后剩余的朋友数量

如果 元汉堡的总价格超过了 K小姐 的钱数 ,那么最多只能买 个汉堡,花费 元。

否则,在买完 元汉堡后,如果剩下的钱加上剩余的朋友数量可以再凑成一个 元的汉堡,那么就再买一个,并将剩下的钱按照 元一个汉堡的价格继续购买。如果不能凑成 元的汉堡,那么最多就只能买 个汉堡,花费 元。

参考代码

  • Python
T = int(input())

def solve():
    n, m = map(int, input().split())
    t = m // 5  # 5元汉堡个数
    m %= 5
    
    if t * 5 > n:
        print(n // 5, (n // 5) * 5)
    else:
        n -= t * 5
        if n >= 10 - m:
            n -= (10 - m)
            print(t + 1 + (n // 10), t * 5 + 10 - m + (n // 10) * 10)
        else:
            print(t, t * 5)

for _ in range(T):
    solve()
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        
        while (T-- > 0) {
            solve(sc);
        }
    }
    
    private static void solve(Scanner sc) {
        int n = sc.nextInt();
        int m = sc.nextInt();
        int t = m / 5;  // 5元汉堡个数
        m %= 5;
        
        if (t * 5 > n) {
            System.out.println((n / 5) + " " + ((n / 5) * 5));
        } else {
            n -= t * 5;
            if (n >= 10 - m) {
                n -= (10 - m);
                System.out.println((t + 1 + (n / 10)) + " " + (t * 5 + 10 - m + (n / 10) * 10));
            } else {
                System.out.println(t + " " + (t * 5));
            }
        }
    }
}
  • Cpp
#include <iostream>

using namespace std;

void solve() {
    int n, m;
    cin >> n >> m;
    int t = m / 5;  // 5元汉堡个数
    m %= 5;
    
    if (t * 5 > n) {
        cout << n / 5 << " " << (n / 5) * 5 << endl;
    } else {
        n -= t * 5;
        if (n >= 10 - m) {
            n -= (10 - m);
            cout << t + 1 + (n / 10) << " " << t * 5 + 10 - m + (n / 10) * 10 << endl;
        } else {
            cout << t << " " << t * 5 << endl;
        }
    }
}

int main() {
    int T;
    cin >> T;
    
    while (T--) {
        solve();
    }
    
    return 0;
}

🌤 02.二进制字符串的十进制值

题目描述

K小姐特别喜欢二进制字符串。有一天,博学的 A 先生在迁居时遇到了 K 小姐,他准备考考她。

A先生每次会给K小姐一个长度为 的二进制字符串 。他定义了一种新的子串 ,作为十进制表示形式为 的数字(可能有前导零)。A 先生定义字符串的十进制值 为所有有效的 的总和,换句话说:

例如,对于字符串

因此,

A 先生允许 K 小姐每次可以交换字符串的任意两个相邻元素,最多可以进行 次操作。他问 K 小姐,在进行操作后,字符串的十进制值最小是多少。K 小姐喜欢分享,于是她邀请你一起解决这个问题。

输入格式

第一行包含一个整数 ,表示测试用例的数量。

对于每组测试用例:

  • 第一行包含两个整数 ,分别表示字符串的长度和允许的最大操作数。
  • 第二行包含一个长度为 ,仅由 组成的二进制字符串

输出格式

对于每组测试用例,分别输出一行,每行一个整数,表示在最多可以进行 次操作后字符串的最小十进制值。

样例输入

2
5 0
10100
7 2
0010100

样例输出

21
12

数据范围

题解

观察可以发现中间部分的 '1' 对答案的贡献不变,只有首尾的 '1' 贡献会不一样,主要策略是尽量将 '1' 移动到字符串的尾部,从而减少由 '1' 产生的高权重。首先尝试将最后一个 '1' 尽可能右移,如果剩余操作数还允许,再将第一个 '1' 尽可能左移。这样可以最大程度减少 '1' 的有效出现次数,从而降低总和。

参考代码

  • Python
def solve():
    n, k = map(int, input().split())
    s = input().strip()
    idx0 = s.find('1')
    idx1 = s.rfind('1')

    # Function to perform operation 0
    def op0(idx0):
        nonlocal k
        if idx0 == -1:
            return
        while k > 0 and idx0 > 0:
            s_lst = list(s)
            s_lst[idx0], s_lst[idx0 - 1] = s_lst[idx0 - 1], s_lst[idx0]
            s = ''.join(s_lst)
            k -= 1
            idx0 -= 1

    # Function to perform operation 1
    def op1(idx1):
        nonlocal k
        if idx1 == -1:
            return
        while k > 0 and idx1 < n - 1:
            s_lst = list(s)
            s_lst[idx1], s_lst[idx1 + 1] = s_lst[idx1 + 1], s_lst[idx1]
            s = ''.join(s_lst)
            k -= 1
            idx1 += 1

    if n - idx1 - 1 <= k:
        op1(idx1)
    op0(idx0)
    res = 0
    for i in range(n - 1):
        res += int(s[i:i + 2])
    print(res)

T = int(input())
for _ in range(T):
    solve()

  • Java
import java.util.Scanner;

public class Main {

    static void solve() {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int k = scanner.nextInt();
        String s = scanner.next();
        int idx0 = s.indexOf('1');
        int idx1 = s.lastIndexOf('1');

        // 操作0:将'1'向左移动
        Runnable op0 = () -> {
            if (idx0 == -1) return;
            while (k > 0 && idx0 > 0) {
                char temp = s.charAt(idx0);
                s.setCharAt(idx0, s.charAt(idx0 - 1));
                s.setCharAt(idx0 - 1, temp);
                k--;
                idx0--;
            }
        };

        // 操作1:将'

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏短期内不再更新,请勿继续订阅

全部评论
第一题测试用例 3 16 -> 3 15
点赞 回复 分享
发布于 2024-08-19 15:02 上海
加油加油
点赞 回复 分享
发布于 2024-08-01 11:59 江苏
最后一题是0/1分数规划,在笔试中一般作为压轴题出现,建议大家好好掌握
点赞 回复 分享
发布于 2024-08-01 11:57 江苏
大家觉得这场的难度怎么样呢?
点赞 回复 分享
发布于 2024-08-01 11:56 江苏

相关推荐

评论
2
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务