首页 > 试题广场 >

支付宝消费打折

[编程题]支付宝消费打折
  • 热度指数:8409 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
众所周知,在一些消费支付的场合中,往往有“支付宝九五折”的优惠。
这天小苯来到了超市购买物品,一共有 n 种物品,每种物品只能购买一个,但有的物品支持优惠活动,有的并不支持。恰好本超市的结账是有“支付宝九五折”优惠的,小苯的支付宝余额还剩 k 元,他想知道他仅使用支付宝进行支付的话,最多能买几件物品?

输入描述:
输入包含三行。
第一行两个正整数 n, k\ (1 \leq n \leq 10^5), \ (1 \leq k \leq 10^9)
第二行包含 n 个正整数 a_i (1 \leq a_i \leq 10^4) 表示每个物品的价格。
第三行一个长度为 n 的只含有 01 的字符串,表示每个物品是否支持优惠。(如果是 1 代表第 i 个物品支持优惠,否则不支持。)


输出描述:
输出一行一个整数表示答案。
示例1

输入

5 9
3 4 2 3 1
11101

输出

4

说明

选择买第 1,3,4,5 个物品。
#include <stdio.h>
#include <stdlib.h>

int compare(const void* a, const void* b) {
    float* fa = (float*)a;
    float* fb = (float*)b;
    if (*fa > *fb) return 1;
    else if (*fa < *fb) return -1;
    else return 0;
}

int main() {
    int n, k;
    scanf("%d %d", &n, &k);

    int price[n];
    char discount[n];
    float final_price[n];

    for (int i = 0; i < n; i++) {
        scanf("%d", &price[i]);
    }
    // 读取优惠标识
    scanf("%s", discount);

    for (int i = 0; i < n; i++) {
        if (discount[i] == '1') {
            final_price[i] = price[i] * 0.95;
        } else {
            final_price[i] = price[i];
        }
    }

    qsort(final_price, n, sizeof(float), compare);

    int count = 0;
    double total = 0.0;
    for (int i = 0; i < n; i++) {
        if (total + final_price[i] <= k) {
            total += final_price[i];
            count++;
        } else {
            break;
        }
    }

    printf("%d\n", count);

    return 0;
}
发表于 2026-02-02 23:04:12 回复(0)