UPC-購買巧克力(貪心)

購買巧克力

時間限制: 1 Sec 內存限制: 128 MB
[提交] [狀態]
題目描述
SHOI這次科技競賽取得了好成績,想慶祝一番,他手頭總共有M元,購買巧克力來讓同學分享快樂。他在SH商店逸擇購買,在巧克力商品櫃中共有N塊巧克力,每塊巧克力的價格是a[i]元.商家爲了促銷,提供給他K張優惠券,使用方法是:對於每塊巧克力,如果使用一張優惠券,則可以以b[i]的優惠價格購買.注意每塊巧克力只能使用一張優惠券,只能購買一次。
SHOI想知道自己最多可以購買多少塊巧克力?
輸入
第一行三個整數N,K,M(0≤K≤N≤100000,M≤1014)。接下來N行,每行兩個整數,表示a[i]和bi
輸出
一個整數表示最多購買巧克力數。
樣例輸入 Copy
4 1 7
3 2
2 2
8 1
4 3
樣例輸出 Copy
3
提示
樣例解釋:選擇第1、2、3塊巧克力,其中第三塊使用優惠券,總共5元。

對於20%的數據N≤10。
對於50%的數據:N≤100
對於100%的數據:N≤100000

又被貪心搞了,wa7次

思路:
很簡單的思路,先把所有的優惠券都用完,要想要花錢最少並且數量最多的話,就按照b排序。
然後再從剩下的商品裏看最多能買多少,這時候就需要按照a排序了。
要注意一個商品只能用一次,所以要再加個標記。
菜的真實

#include<bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
 
const int maxn=1e6+7;
ll n,k,m;
struct node{
    ll a,b;
    ll flag;///記錄是否被用過
};
node a[maxn];
 
bool cmp1(node a,node b){
    return a.b<b.b;
}
 
bool cmp2(node a,node b){
    if(a.flag==b.flag) return a.a<b.a;
    return a.flag<b.flag;
}
 
int main(){
   n=read();k=read();m=read();
    for(int i=1;i<=n;i++){
        a[i].a=read();a[i].b=read();
    }
    sort(a+1,a+1+n,cmp1);
    int res=0;
    for(int i=1;i<=k;i++){
        if(a[i].b<=m){
            m-=a[i].b;
            a[i].flag=1;
            res++;
        }
    }
    if(m<=0){
        cout<<res<<endl;
        return 0;
    }
    sort(a+1,a+1+n,cmp2);
    for(int i=1;i<=n;i++)
        if(!a[i].flag){
            if(a[i].a<=m){
                m-=a[i].a;
                res++;
            }
            if(m<=0){
                cout<<res<<endl;
                return 0;
            }
        }
    cout<<res<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章