题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6438
其实这道题也不太难,就是一个有队列就过了。不过比赛时候脑残了,一直WA。事后不到10分钟就A了太伤心了。
就是,每走到一个地方,如果这个地方价格大于最小值,就直接卖掉,不过这个地方的价格也要入队列,而且要加一个状态。
就是这个可以用两次,而且第一次用的时候次数不用增加。
代码:
import java.io.*;
import java.util.*;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
int t=getInt();
while(t--!=0) {
long sum=0,m=0;
int n=getInt();
PriorityQueue<Node> q=new PriorityQueue<Node>();
q.add(new Node(getInt())); //先添加一个节点
for(int i=1;i<n;i++) {
int a=getInt();
Node l=new Node(a);
Node node=q.peek(); //取最小值
if(node.v<a) { //如果当前价格大于最小值,就可以直接出售。
node.c--;
if(node.c==-1) {
q.poll();
m+=2;
}
else {
q.poll();
q.offer(node);
}
l.c++;
sum+=(a-node.v);
}
q.offer(l);
}
System.out.println(sum+" "+m);
}
}
static int getInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
}
//优先队列的排序规则
class Node implements Comparable{
int v,c; //v储存价值,c储存这个点是否被用过
public Node(int x) {
v=x;
}
//看这个==
public int compareTo(Object king) {
Node n=(Node)king;
if(this.v>n.v)
return 1;
if(this.v<n.v)
return -1;
if(this.c>n.c)
return -1;
if(this.c<n.c)
return 1;
return 0;
}
}