2617 - 运输

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB
现在已知N件商品,和搬运它们其中每一件的费用。
现在搬家公司老板Mr.sb决定让我们每次任意选取2件商品。
然后这2件商品只算一件商品的费用。
但是这个商品的搬运费用是将选出的2个商品的费用之和除以k的运算结果。
如此反复。直到只收一件商品的钱。
这个就是商店要付的费用。
掌柜的想尽可能的少付钱,以便将更多的钱捐给希望工程。
所以请你帮他计算一下最少只用付多少钱。

题目输入

n,k
w1,w2.....wn(每一件物品搬运费

题目输出

一个数 最少付多少钱

输入/输出样例

输入格式

5 2
1 2 3 4 5

输出格式

1

C++解答

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
using namespace std;
int main()
{
	priority_queue<int>q;
	int n,k;
	cin>>n>>k;
	int x;
	for(int i=1;i<=n;++i)
	{
		cin>>x;
		q.push(x);
	}	
	for(int i=1;i<=n-1;++i)
	{
		int sum=q.top();
		q.pop();
		sum=sum+q.top();
		q.pop();
		sum=sum/k;
		q.push(sum);
	}
	
	cout<<q.top();
	return 0;
}

Java解答

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
	public static void main(String[] args) {
//		long sta = System.nanoTime();
 
		InputStream is = System.in;
		OutputStream os = System.out;
 
		IN cin = new IN(is);
		PrintWriter cout = new PrintWriter(os);
 
		SO so = new SO();
		so.solution(cin, cout);
 
//		long end = System.nanoTime();
//		cout.println("耗时:" + (double)(end-sta)/1e6 + "ms");
 
		cout.close();
	}
 
	static final int MOD = (int)1e9 + 7;
	//实际代码开始的类--------------------------------------------------
	static class SO {
		void solution(IN cin, PrintWriter cout) {
			int n = cin.nextInt(), k = cin.nextInt();
			Queue<Integer> pq = new PriorityQueue<Integer>((a1,a2)->a2-a1);
			for(int i=0;i<n;++i) {
				pq.add(cin.nextInt());
			}
			int cur = 0;
			while(n>1) {
				int a = pq.remove(), b = pq.remove();
				cur = (a+b)/k;
				pq.add(cur);
				--n;
			}
			cout.println(pq.remove());
		}//end solution
	}//end SO
	
	//以下是快读部分
	static class IN {
		private BufferedReader reader;
		private StringTokenizer tokenizer;
 
		IN(InputStream is) {
			reader = new BufferedReader(new InputStreamReader(is), 32768);
			tokenizer = null;
		}
		
		public String next() {
			while (tokenizer == null || !tokenizer.hasMoreTokens()) {
				try {
					tokenizer = new StringTokenizer(reader.readLine());
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			}
			return tokenizer.nextToken();
		}
 
		public int nextInt() {
			return Integer.parseInt(next());
		}
 
		public long nextLong() {
			return Long.parseLong(next());
		}
 
		public double nextDouble() {
			return Double.parseDouble(next());
		}
 
	}
}