列表

详情


NC54285. GJX卖鸡排

描述


众所周知,GJX多才多艺,会唱跳、RAP、做鸡排。

鉴于之前参加商业竞赛并没有赚到什么钱,所以他决定卖鸡排。

GJX一口气制作了N个鸡排,设第i个鸡排的价格为p_i

由于舍友经常趁他卖鸡排的时候偷吃他做的鸡排,所以他决定每天只拿出一个鸡排来卖。

但我们都知道,鸡排是有保质期的,设第i个鸡排的保质期最后一天为d_i善良的GJX是不会卖过期的鸡排的。

GJX一下子就想出了能赚到最多钱的卖鸡排方案,聪明的你也一定知道吧!

输入描述

输入包含多组测试样例。
第一行给出一个正整数,表示T组数据。

每组数据第一行给出正整数N,表示有N个鸡排。

接下来N行,每行给出两个正整数p_id_i,表示第i个鸡排的价格和保质期的最后一天。

输出描述

一行,一个整数,表示GJX最多能赚多少钱。

示例1

输入:

1
4
50 2
10 1
20 2
30 1

输出:

80

说明:

GJX首先在第1天卖出30元的鸡排,然后在第2天卖出50元的鸡排。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 874ms, 内存消耗: 29796K, 提交时间: 2019-10-30 10:02:57

#include<iostream>
#include<cstring>
#include<cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

inline int read()
{
    int x=0,f=1;
    char ch = 0;
    while(!isdigit(ch))
    {
        if(ch=='-') f = -1;
        ch = getchar();
    }
    while(isdigit(ch))
    {
        x = x*10+ch-'0';
        ch = getchar();
    }
    return x*f;
}
const int maxpd = 1e5+10;
int T,n;
struct Chicken
{
    int p,d;
    friend bool operator<(const Chicken &x,const Chicken &y)
    {
        return x.p<y.p;
    }
}ck[maxpd];
inline bool cmp(const Chicken &x,const Chicken &y)
{
    return x.d<y.d;
}
priority_queue<int> q2;
vector<int> pc[maxpd];
int main()
{
    long long ans;
    //priority_queue<Chicken> Q;

    int mx;
    T = read();
    while(T--)
    {
        n = read();
        ans = 0;
        mx = 0;
        //memset(ck,0,sizeof(ck));
        for(int i=1; i<=n; i++)
        {
            //ck[i].p = read();
            //ck[i].d = read();
            int a = read(), b = read();
            pc[b].push_back(a);
            mx = max(mx,b);
        }
        //sort(ck+1,ck+1+n,cmp);
        //int j=n;
        for(int i=mx,k=0; i>=1; i--)
        {
            /*
            while(ck[j].d>=i && j>0)
            {
                //Q.push(ck[j]);
                q2.push(ck[j].p);
                j--;

            }
            */
            for(int j=0; j<pc[i].size(); j++)
            {
                q2.push(pc[i][j]);
            }
            pc[i].clear();
            ///if(j<1+n-k)
            if(!q2.empty())
            {

                //ans += Q.top().p;
                ans += q2.top();
                //Q.pop();
                q2.pop();
                k++;
            }
        }
        printf("%lld\n",ans);
        //while(!Q.empty()) Q.pop();
        while(!q2.empty()) q2.pop();
    }
    return 0;
}

C++(clang++11) 解法, 执行用时: 789ms, 内存消耗: 1460K, 提交时间: 2020-11-13 20:26:22

#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
struct ch{
	int p,d;
}a[maxn];
bool cmp(const ch &x, const ch &y){
	return x.d<y.d;
}
priority_queue<ch>q;
bool operator < (const ch &x, const ch &y){
	return x.p>y.p;
}
int main(){
	int t;scanf("%d",&t);
	while(t--){
		int n;scanf("%d",&n);
		for(int i=1;i<=n;i++)scanf("%d%d",&a[i].p,&a[i].d);
		sort(a+1,a+n+1,cmp);
		for(int i=1;i<=n;i++){
			if(a[i].d>q.size())q.push((ch){a[i].p,a[i].d});
			else {
				q.push((ch){a[i].p,a[i].d});
				q.pop();
			}
		}
		long long ans=0;
		while(q.empty()==false){
			ans+=q.top().p;
			q.pop();
		}
		printf("%lld\n",ans);
	}
	return 0;
}

上一题