tokitsukaze and Soldier 贪心

题目链接
在这里插入图片描述

  • 分析

解析:先处理更加“宽容”的人(希望士兵团不超过的人数更多的人),那么那些不那么“宽容”的被分配到团中时,比这个人更加“宽容”的人也能分配到团中。那么问题就变成了动态的topK问题了。

首先按 s 排序, 然后以 v 值建立一个小根堆(优先队列)
然后对于当前的 a[i] 先进入队列(注意这一步很重要, 判断完再进队是错的)
【 因为这个点我们可能根本就不需要取, 所以不能弹出多余的元素再入队, 要直接入队】
然后此时判断 a[i].s 跟队列大小, 弹出队里最小的元素
在模拟的过程中不断更新答案即可

  • 代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.PriorityQueue;

public class Main {

	static int n,len;
	static Integer a[],b[];
	
	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();n=(int)in.nval;
		long v[]=new long [n];
		long []s=new long [n];
		PriorityQueue<Long>q=new PriorityQueue<Long>();
		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++) {
			q.add(v[i]);
			sum+=v[i];
			if(q.size()>s[i]) {
				while(q.size()>s[i]) {
					sum-=q.poll();
				}
			}
			max=Math.max(max, sum);
		}
		out.println(max);
		out.flush();
	}
	static void QuickSort(int l,int r,long s[],long v[]) {
		int i=l,j=r;
		long key=s[r+l>>1],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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值