tokitsukaze and Soldier 题解

tokitsukaze and Soldier

https://ac.nowcoder.com/acm/problem/50439

考点:贪心 + 优先队列(PriorityQueue)
读了一遍题目让我想起来了堆,优先队列的数据结构所需要的就是堆,而且不用手写堆emmm。
很容易就可以想到先按s从大到小进行排序。
然后从头开始遍历,先把当前元素v加入queue中,然后判断优先队列中元素是否比s[i]大,大的话就把多余的从queue中扔出;
每次计算sum的值,取最大值就好。
import java.util.*;
import java.math.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
public class Main {
    public static void main(String args[])throws IOException
    {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        in.nextToken();
        int n = (int)in.nval;
        long v[] = new long[n];
        long s[] = new long[n];
        PriorityQueue<Long> queue = new PriorityQueue<>();
        long sum=0,max=0;
        for(int i=0;i<n;i++)
        {
            in.nextToken();
            v[i] = (long)in.nval;
            in.nextToken();
            s[i] = (long)in.nval;
        }
        long tempss,temp;
        QuickSort(0,n-1,s,v);
        for(int i=0;i<n;i++)
        {
            queue.add(v[i]);
            sum+=v[i];
            if(queue.size()>s[i])
            {
                while(queue.size()>s[i])
                {
                    sum-=queue.peek();
                    queue.poll();
                }
            }
                max = Math.max(max, sum);
        }
        out.println(max);
        out.flush();
    }
   public static void QuickSort(int l,int r,long s[],long v[])
    {
        int i=l,j=r;
        long key = s[(r+l)/2],temp=0;
         
        do{
            while(s[j]<key)
                j--;
            while(s[i]>key)
                i++;
            if(i<=j)
            {
                temp = s[j];
                s[j] = s[i];
                s[i] = temp;
                temp = v[j];
                v[j] = v[i];
                v[i] = temp;
                i++;
                j--;
            }
        }while(i<=j);
        if(l<j) QuickSort(l,j,s,v);
        if(i<r) QuickSort(i,r,s,v);
         
    }
}


全部评论

相关推荐

07-02 13:52
武汉大学 golang
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 16:15
你知道对于一个平常不接电话,从来不发语音,只打字交流的人来说电话面有多恐怖吗....刚刚亲眼目睹了舍友电话面...她甚至还在吃饭...就这么水灵灵的打过来开始问了...感觉如果是面对面我真的会紧张到跪下来给面试官磕一个...
一只ikun:额,其实没那么恐怖,最难迈开的是第一步,相信我,你面完第一次后面就不怕了。第一次面试我还想着找个自习室面试,到后面我打着游戏突然来电话我就直接面试了
点赞 评论 收藏
分享
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
无实习如何秋招上岸
点赞 评论 收藏
分享
07-01 19:00
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务