首页 > 试题广场 >

小红的优惠券

[编程题]小红的优惠券
  • 热度指数:4354 时间限制: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)
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)
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.*;

// 注意类名必须为 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)
#include <iostream>
#include <map>
#include <set>
using namespace std;

int main() {
    int n,m;
    cin>>n>>m;
    multimap<int,int> k;
    for(int i=1;i<=m;i++){
        int a,b;
        cin>>a>>b;
        k.insert({a,b});
    }
    int flag=0;
    set<int> t;
    for(auto it=k.rbegin();it!=k.rend();it++){
        if(it->first<=n){
            t.insert(n-it->second);
        }//不需要再加购时的最低
        else if(it->first>n){
            t.insert(it->first-it->second);
        }//加购后的最低
    }
    if(t.empty()||(*t.begin()>n)){
        cout<<n;
    }else{
        cout<<*t.begin();
    }
}
// 64 位输出请用 printf("%lld")
这不对吗?还是说我理解有问题
发表于 2025-11-09 21:14:21 回复(1)
#include <algorithm>
#include <iostream>
using namespace std;

int main() {
    int n, m, maxi = 0;
    cin >> n >> m;
    while(m--){
        int a, b;
        cin >> a >> b;
        //如果满足使用条件
        if(a <= n){
            //维护最大优惠价格
            maxi = max(maxi, b);
        }
    }
    cout << n - maxi;
    return 0;
}
// 64 位输出请用 printf("%lld")
没啥需要注意的

发表于 2025-10-24 18:41:23 回复(0)
n, m = map(int, input().split())
check = []
for i in range(m):
    a = list(map(int, input().split()))
    check.append(a)

res = []
for item in check:
    if item[0] <= n:
        pay = n - item[1]
        res.append(pay)
    else:
        res.append(n)
print(min(res))

发表于 2025-10-19 21:02:04 回复(0)
***服了
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        TreeMap<Integer, Integer> map = new TreeMap<>();


        for (int i = 0; i < m; i++) {
            map.put(in.nextInt(), in.nextInt());
        }

        int dis = 0;


        for (int k : map.keySet()) {
            if (k > n) {
                break;
            }
            dis = Math.max(dis, map.get(k));

        }
        System.out.println(n - dis);

    }
}


发表于 2025-10-08 16:33:25 回复(0)
n, m = map(int, input().split())
dic = {}
for _ in range(m):
    k, v = map(int, input().split())
    if k <= n:
        dic[k] = v
if dic == {}:
    print(n)
else:
    new = sorted(dic.items(), key=lambda d: d[1], reverse=True)
    result = n - new[0][1]
    print(result)  
发表于 2025-10-04 10:51:47 回复(0)
n,m = map(int,input().split())
money = []
money.append(n)
for i in range(m):
    a,b = map(int,input().split())
    if n < a:
        continue
    money.append(n-b)
print(min(money))
发表于 2025-10-03 17:38:08 回复(0)
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(); // 结算金额
        int m = in.nextInt(); // 卷的个数

        int[] a = new int[m];
        int[] b = new int[m];

        int ans = 1000001;

        int res = 0;

        for (int i = 0; i < m; i++) {
            a[i] = in.nextInt();
            b[i] = in.nextInt();
            if (n >= a[i]){ // 符合满减条件
                res = n - b[i];
            }else{ // 不符合
                res = n; // 优惠卷可以不用呀
            }
            ans = Math.min(ans,res);
        }
        System.out.println(ans);

    }
}

发表于 2025-09-08 12:22:42 回复(0)
package main

import (
    "fmt"
)

func main() {
    n, m := 0,0
    fmt.Scan(&n, &m)

    if m == 0 || n == 0 {
        fmt.Println(n)
        return
    }

    yhqs := [][2]int{}
    for {
        aj,bj := 0,0
        n, _ := fmt.Scan(&aj, &bj)
        if n == 0 {
            break
        }

        yhq := [2]int{aj, bj}
        yhqs = append(yhqs, yhq)

    }
    // fmt.Println(n, m, yhqs)

    min := n // 最低价
    for _, v := range yhqs {
        yhj := n // 当前优惠券的优惠价
        if n >= v[0] {
            yhj -= v[1]
        }
        if min > yhj {
            min = yhj
        }
    }

    fmt.Println(min)
}

发表于 2025-09-02 10:08:57 回复(0)

import java.util.*; 
import java.io.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        String[] line1=bf.readLine().split(" ");
        int n=Integer.parseInt(line1[0]);
        int m=Integer.parseInt(line1[1]);

        //遍历统计哪些优惠券可用,可用的优惠劵再判断其优惠金额是否最大
        int[] discount=new int[]{n,0};

        while(m>0){
            String[] line=bf.readLine().split(" ");
            int disN=Integer.parseInt(line[0]);
            int disM=Integer.parseInt(line[1]);
            if(disN<=n&&disM>discount[1]){
                discount[0]=disN;
                discount[1]=disM;
            }
            m--;
        }
        System.out.println(n-discount[1]);
    }
}

发表于 2025-09-01 23:00:53 回复(0)
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n,m;
    cin >> n >> m;
    
    //为啥要排序啊,。找到一张最大的优惠券不就行了。。。
    int max_dis = 0;
    for (int i = 0, a,b; i<m; ++i)
    {
        cin >> a >> b;
        if (n >= a)
        {
            max_dis = max(max_dis, b);
        }
    }
    cout << n - max_dis;
}
// 64 位输出请用 printf("%lld")


发表于 2025-09-01 20:15:03 回复(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)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        Map<Integer, Integer> map = new TreeMap<>();
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            int b = in.nextInt();

            for (int i = 0; i < b; i++) {
                map.put(in.nextInt(),in.nextInt());
            }
            int x =0;
            int y =0;
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                if (a >= entry.getKey()){
                    x = entry.getKey();
                    y = y > entry.getValue() ? y : entry.getValue();
                }else {
                    break;
                }
            }
            if(x != 0){
                System.out.print(a - y);
            }else {
                System.out.println(a);
            }

        }
    }
}

发表于 2025-08-15 11:17:20 回复(0)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n,m;
    cin>>n>>m;
    vector<vector<int>> a(m,vector<int>(2,0));

    for(int i=0;i<m;i++)
    {
        for(int j=0;j<2;j++)
        {
            cin>>a[i][j];
        }
    }

    sort(a.begin(),a.end());
   if(a[0][0]>n)
   {
    cout<<n;
    return 0;
   }
   int returnVal=0;
   int maxVal=0;
   for(int i=0;i<a.size()-1;i++)
   {
     // cout<<a[i][0]<<endl;
      if(a[i][0]<=n && a[i+1][0]>n)
      {

     
      returnVal=i;
       //cout<<returnVal<<endl;
      break;

      }
   }
    for(int j=0;j<=returnVal;j++)
    {
      maxVal=(a[j][1]>maxVal?a[j][1]:maxVal);
    }
   

   cout<<n-maxVal;
   return 0;
}
// 64 位输出请用 printf("%lld")
发表于 2025-07-29 09:20:58 回复(0)