HDU 6438-Buy and Resell

30 篇文章 1 订阅

题目链接: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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值