首页 > 试题广场 >

小红的优惠券

[编程题]小红的优惠券
  • 热度指数:8082 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}小红的购物车结算金额为 n 元,她手中有 m 张优惠券。第 j 张优惠券的规则为“满 a_j 元立减 b_j 元”,即若 n\geqq a_j,则使用该券后需支付 n-b_j 元。

\hspace{15pt}小红至多使用一张优惠券,请问最少需要支付多少元?

输入描述:
\hspace{15pt}第一行输入两个整数 n,m\left(1\leqq n\leqq 10^5;\ 1\leqq m\leqq 100\right)
\hspace{15pt}接下来 m 行,第 j 行输入两个整数 a_j,b_j\left(1\leqq b_j\leqq a_j\leqq 10^5\right),描述第 j 张优惠券。


输出描述:
\hspace{15pt}输出一个整数,表示小红使用最优策略后需支付的最少金额。
示例1

输入

100 3
300 50
200 30
50 5

输出

95

说明

仅第三张券可用,支付 100-5=95 元。

最简便写法

#include <climits>
#include <iostream>

using namespace std;

int main() {
    int n,m;
    cin>>n>>m;
    int t=INT_MIN;
    while (m--) {
        int a,b;
        cin>>a>>b;
        if(n>=a && b>t) t=b; 
    }
    if (t!=INT_MIN) {
        cout<<n-t;
    }else{
        cout<<n;
    }

}
// 64 位输出请用 printf("%lld")
发表于 2025-08-06 23:27:37 回复(0)
n,m = map(int,input().split())
max_youhui = 0
for i in range(m):
    a,b = map(int,input().split())
    if n>=a and b>max_youhui:
        max_youhui = b
print(n-max_youhui)
发表于 2025-08-29 19:48:41 回复(0)
n,m = map(int,input().split())
lis_a = []
lis_b = []
lis_c = [0]
for i in range(m):
    a,b = map(int,input().split())
    lis_a.append(a)
    lis_b.append(b)
for j in range(len(lis_a)):
    if lis_a[j] <= n:
        lis_c.append(lis_b[j])
res = n - max(lis_c)
print(res)
发表于 2025-08-22 12:18:59 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int amount = in.nextInt();
        int n = in.nextInt();
        int max = 0;
        while (n-- > 0) {
            int limit = in.nextInt();
            int discount = in.nextInt();
            if (limit > amount) continue;
            max = Math.max(max, discount);
        }
        System.out.println(amount - max);
    }
}

发表于 2025-09-03 13:27:38 回复(0)
#include<bits/stdc++.h>
using namespace std;

struct conpon{
    int a,b;
};

bool cmp(const conpon &x,const conpon &y){
    return x.a < y.a;  
}

int main(){
    int n,m;
    cin>>n>>m;
    vector<conpon>cps(m);
   
    for(int i=0;i<m;i++){
        cin>>cps[i].a>>cps[i].b;
    }
   
    sort(cps.begin(),cps.end(),cmp);
   
    int maxmoney = 0;
   
    for(auto cp : cps){
        if(cp.a <= n){        
            if(cp.b > maxmoney){
                maxmoney = cp.b;  // 不断更新最大优惠
            }
        }
    }
   
    cout << n - maxmoney << endl;
    return 0;
}
新手写法
发表于 2026-04-24 16:36:10 回复(2)
服了呀,只能用这一张券,我就说怎么我的结果比答案更低
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static class Promotion{
        int menkan;
        int youhui;
        public Promotion(int menkan, int youhui){
            this.menkan = menkan;
            this.youhui = youhui;
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        Promotion[] pList = new Promotion[m];
        for(int i=0;i<m;i++){
            pList[i] = new Promotion(in.nextInt(), in.nextInt());
        }
        //按照优惠力度从高到低排序
        //如果优惠力度相同,则看谁门槛高,因为用过后可能达不到了
        Arrays.sort(pList, (p1,p2) -> {
            if(p1.youhui != p2.youhui){
                return p2.youhui - p1.youhui;
            }
            else{
                return p2.menkan - p1.menkan;
            }
        });

        for(int i=0;i<m;i++){
            if(pList[i].menkan <= n){
                n -= pList[i].youhui;
                if(n < 0){//消费不起
                    n += pList[i].youhui;
                    break;
                }
            }
        }
        System.out.println(n);
    }
}
发表于 2026-04-23 22:10:43 回复(0)
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int n, m;
    while (cin >> n >> m) {
        int min_pay = n;
        for (int i = 0; i < m; i++) {
            int a, b;
            cin >> a >> b;
            if (n >= a) {
                min_pay = min(min_pay, n - b);
            }
        }
        cout << min_pay << '\n';
    }
    return 0;
}

发表于 2026-04-22 16:51:31 回复(0)
using System;
public class Program {
    public static void Main() {
        string[] nm = Console.ReadLine().Split(" ");
        int n = int.Parse(nm[0]);
        int m = int.Parse(nm[1]);
        int bjMax = -1;
        for (int i = 0; i < m; i++) {
            string[] input = Console.ReadLine().Split(" ");
            int j = int.Parse(input[0]);
            int bj = int.Parse(input[1]);
            if (j <= n) {
                bjMax = Math.Max(bjMax, bj);
            }
        }
        Console.WriteLine(bjMax != -1 ? n - bjMax : n);
    }
}
发表于 2026-04-18 17:29:23 回复(0)
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
    // Write your code here
    const firstLine = await readline();
    const tokens = firstLine.split(" ");
    let n = parseInt(tokens[0]);
    let m = parseInt(tokens[1]);
    let ans = n;
    for (let i = 1; i <= m; i++) {
        const line = await readline();
        let [aStr, bStr] = line.split(" ");
        let a = parseInt(aStr);
        let b = parseInt(bStr);
        if (n >= a) {
            const pay = n - b;
            if (pay < ans) {
                ans = pay;
            }
        }
    }
    console.log(ans)
})();
发表于 2026-03-16 22:05:08 回复(0)
import sys

n,m=map(int,input().split())
minmoney=n
for i in range(m):
    a,b=map(int,input().split())
    if n>=a:
        minmoney=min(minmoney,n-b)
print(minmoney)
       

发表于 2026-02-03 22:30:17 回复(0)
#include <iostream>
#include <climits>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    int min_pay = n;  // 初始为不使用优惠券的情况

    for (int i = 0; i < m; ++i) {
        int a, b;
        cin >> a >> b;
        if (n >= a) {
            min_pay = min(min_pay, n - b);
        }
    }

    cout << min_pay << endl;
    return 0;
}
  • 初始答案为原价 n(不使用任何优惠券)。
  • 遍历每张优惠券:
    • naj,则可用,支付金额为 nbj
    • 用这个金额去更新最小支付金额。
  • 最终输出最小金额。
  • 发表于 2026-01-25 17:40:25 回复(0)
    #include <iostream>
    using namespace std;
    #include<algorithm>
    int main() {
       int n,m;
       cin>>n>>m;
       int minpay=n;
       for(int i=0;i<m;i++){
           int a,b;
           cin>>a>>b;
           if(n>=a){
             int pay=0;
             pay=n-b;
             minpay=min(minpay,pay);
           }
       }
       cout<<minpay;
    }
    // 64 位输出请用 printf("%lld")

    发表于 2026-01-21 16:48:20 回复(0)
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;

    class CouponSystem{
        private:
            vector<pair<int, int>> coupon;
            int price;

        public:
            CouponSystem(int totalprice) : price(totalprice){}

            void addCoupon(int condition, int discount){
                coupon.push_back({condition, discount});
            }

            void sort_Condition(){
                sort(coupon.begin(), coupon.end(), [](const pair<int, int> &a, const pair<int, int> &b){
                    return a.first < b.first;
                });
            }

            int calculate_Discount(){
                int discount = 0;
                for(const pair<int, int> & a : coupon){
                    if(a.first <= price){
                        discount = max(discount, a.second);
                    }
                    else {
                        return price - discount;
                    }
                }
                return price - discount;
            }

    };

    int main() {
        int n, m;
        cin >> n >> m;

        CouponSystem coupon(n);
        for(int i = 0;i < m;i++){
            int condition, discount;
            cin >> condition >> discount;
            coupon.addCoupon(condition, discount);
        }

        coupon.sort_Condition();
        int price = coupon.calculate_Discount();
        cout << price;

        return 0;
    }
    发表于 2026-01-20 21:41:05 回复(0)
    #include <iostream>
    using namespace std;
    
    int main() {
        int n,m;//100 元 m张
        cin>>n;
        cin>>m;
        int arry[m][2];
        for(int i=0;i<m;i++){
            cin>>arry[i][0];
            cin>>arry[i][1];
        }
        int minN=n;
        for(int j=0;j<m;j++){
            if(n>=arry[j][0]){
                int tmp=n-arry[j][1];
                if(tmp<minN){
                    minN=tmp;
                }
            }
        }
        cout<<minN;
    
    }
    // 64 位输出请用 printf("%lld")

    发表于 2026-01-09 14:42:18 回复(0)
    #include <iostream>
    using namespace std;

    int main() {
        int n, m;
        int a, b, min_amount = 100000;
        while (cin >> n >> m) {
            for (int i = 0; i < m; ++i) {
                cin >> a >> b;
                if (a <= n)
                    min_amount = min(min_amount, n - b);
            }
            if ( min_amount < 100000)
                cout << min_amount;
            else cout << n;
        }
    }

    发表于 2026-01-04 13:59:47 回复(0)
    #include <iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;

    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);

        int n,m;
        cin>>n>>m;
        vector<pair<int,int>>ticket(n);
        for(int i = 0; i < m;i++){
            cin>>ticket[i].first>>ticket[i].second;
        }
        int sum = n;
        for(int i = 0; i < m;i++){
            if(ticket[i].first <= n){
                int tmp = n - ticket[i].second;
                sum = min(sum ,tmp);
            }
        }
        cout<<sum<<'\n';

    }
    // 64 位输出请用 printf("%lld")
    发表于 2025-12-26 23:33:13 回复(0)
    import java.util.*;
    
    // 注意类名必须为 Main, 不要有任何 package xxx 信息
    public class Main {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            // 注意 hasNext 和 hasNextLine 的区别
            while (in.hasNextInt()) { // 注意 while 处理多个 case
                int totalPrice = in.nextInt();
                int ticketNum = in.nextInt();
                int[][] nums = new int[ticketNum][2];
                for (int i = 0; i < ticketNum; i++) {
                    nums[i][0] = in.nextInt();
                    nums[i][1] = in.nextInt();
                }
    
                int minPrice = Integer.MAX_VALUE;
                for (int i = 0; i < ticketNum; i++) {
                    if (nums[i][0] <= totalPrice) {
                        minPrice = Math.min(minPrice, totalPrice - nums[i][1]);
                    }
                }
                System.out.println(minPrice == Integer.MAX_VALUE ? totalPrice : minPrice);
            }
        }
    }

    发表于 2025-12-06 14:58:18 回复(0)
    #include <stdio.h>
    #include <limits.h>
    int main() {
        int n,m;
        scanf("%d %d",&n,&m);
        int arr[m][2];
        int min_res=INT_MAX;
        for(int i=0;i<m;i++){
            scanf("%d %d",&arr[i][0],&arr[i][1]);
            int res=n;
            if(n>=arr[i][0]){
                res=n-arr[i][1];
            }
            else{
                res=n;
            }
            if(res<min_res){
                min_res=res;
            }
        }
        printf("%d",min_res);
        return 0;
    }
    发表于 2025-12-05 15:46:04 回复(0)
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct{
        int limit_price;
        int discount;
    }pot_t;
    typedef struct{
        pot_t data;
        struct plist *next;
    }plist;
    int calc_min_price(plist *current, int n)
    {
        static int min = -1;
        if(min == -1) min = n;
        int pay = 0;
        if(current->data.limit_price <= n){
            pay = n - current->data.discount;
            if(pay < min)
                min = pay;
        }
        return min;
    }
    int main() {
        int n,m;
        int min, pay;
        scanf("%d %d",&n,&m);
        plist p; p.next = NULL;p.data.limit_price=0,p.data.discount=0;
        for(int i = 0; i< m;i++){
            plist *pt = (plist *)malloc(sizeof(plist));
            if(pt!=NULL){
                scanf("%d %d",&pt->data.limit_price,&pt->data.discount);
                pt->next = NULL;
            }
            plist *current = &p;
            while(current->next != NULL){
                current= (plist *)current->next;
            }
            current->next = (struct plist *)pt;
        }
        plist *current = (plist *)p.next;
        min = n;
        while(current->next!=NULL){
            min = calc_min_price(current, n);
            current=(plist *)current->next;
        }
        min = calc_min_price(current, n);
        printf("%d",min);
        return 0;
    }
    发表于 2025-12-04 02:24:44 回复(0)
    n,m=map(int,input().split())
    list=[n]
    for i in range(m):
        a,b=map(int,input().split())
        if n>=a:
            list.append(n-b)
    print(min(list))
    发表于 2025-11-17 14:11:39 回复(0)