| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴Java代码。堆(优先队列) O(n*log n) ,带注释//以分数高低排序
//然后以有可能成为中间值的cow的分数为中间值,分别求左右两边的最小的总cost并记录
//最后扫描这些有记录的cow,输出最佳答案。
//值得一提的是这道题还可以用二分查找来做,但计算量不变。
//主要步骤就是分别对成绩和钱排序,然后二分搜索成绩,按钱来进行检验。
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 该优先队列按aid从大到小降序
Comparator<cow> cmpa = new Comparator<cow>(){
public int compare(cow a, cow b){
return b.f - a.f;
}
};
PriorityQueue<cow> pqJ = new PriorityQueue<cow>(1,cmpa);
// 输入数据
String[] NCF = br.readLine().split("\\s");
int N = new Integer(NCF[0]), C = new Integer(NCF[1]), F = new Integer(NCF[2]);
cow cows[] = new cow[C];
for(int i = 0; i < C; i ++){
cows[i] = new cow();
String[] sf = br.readLine().split("\\s");
cows[i].sc = new Integer(sf[0]);
cows[i].f = new Integer(sf[1]);
}
// 按分数从大到小降序
Arrays.sort(cows);
int n = N/2;
int costL = 0;
// 先让前N/2个cow进优先队列并计算aid的总和costL,
for(int i = 0; i < n; i++){
costL += cows[i].f;
pqJ.add(cows[i]);
}
// 然后依次对第N/2 到 (C-N/2)的cow进行处理,
// 将costL记录在当前cow中,
// 然后对比当前cow的aid和堆顶aid的大小,
// 如果当前cow较小,则删除堆顶cow,压入当前cow
// 更新costL,重复步骤1
for(int i = n; i < C - n; i++){
cows[i].costL = costL;
int f = pqJ.peek().f;
if(cows[i].f < f){
costL += cows[i].f - f;
pqJ.poll();
pqJ.add(cows[i]);
}
}
// 用同样的方法计算costR
pqJ.clear();
int costR = 0;
for(int i = C-1; i > C-1-n; i--){
costR += cows[i].f;
pqJ.add(cows[i]);
}
for(int i = C-1-n; i >= n; i--){
cows[i].costR = costR;
int f = pqJ.peek().f;
if(cows[i].f < f){
costR += cows[i].f - f;
pqJ.poll();
pqJ.add(cows[i]);
}
}
// 最后遍历第N/2 ~ (C-N/2)的cow计算其costL + costR + aid的值
// 如果这个值 <=F 则是满足要求的,输出满足要求的最大值。
// 如果没有满足要求的,则输出-1
int ans = -1;
for(int i = n; i < C - n; i++){
int cost = cows[i].costL + cows[i].costR +cows[i].f;
if(cost <= F)
ans = Math.max(ans, cows[i].sc);
}
System.out.println(ans);
}
}
class cow implements Comparable<cow>{
int sc, f,
costL = -1, costR = -1;
// 按分数从大到小降序
public int compareTo(cow o) {
return o.sc - this.sc;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator