1. 程式人生 > >網易 [程式設計題] 塔

網易 [程式設計題] 塔

[程式設計題] 塔

時間限制:1秒

空間限制:262144K

小易有一些立方體,每個立方體的邊長為1,他用這些立方體搭了一些塔。

現在小易定義:這些塔的不穩定值為它們之中最高的塔與最低的塔的高度差。

小易想讓這些塔儘量穩定,所以他進行了如下操作:每次從某座塔上取下一塊立方體,並把它放到另一座塔上。

注意,小易不會把立方體放到它原本的那座塔上,因為他認為這樣毫無意義。

現在小易想要知道,他進行了不超過k次操作之後,不穩定值最小是多少。

輸入描述:

第一行兩個數n,k (1 <= n <= 100, 0 <= k <= 1000)表示塔的數量以及最多操作的次數。
第二行n個數,ai(1 <= ai <= 104)表示第i座塔的初始高度。

輸出描述:

第一行兩個數s, m,表示最小的不穩定值和操作次數(m <= k)
接下來m行,每行兩個數x,y表示從第x座塔上取下一塊立方體放到第y座塔上。

輸入例子1:

3 2
5 8 5

輸出例子1:

0 2
2 1
2 3
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

bool cmp(pair<int, int> &a, pair<int, int> &b)
{
	return a.second < b.second;
}
int main()
{
	
	int n, k;
	cin >> n >> k;
	vector<pair<int, int>> vec(n + 1, make_pair(0, 0));
	vector<pair<int, int>> res;

	for (int i = 1; i <= n; i++)
	{
		int temp;
		cin >> temp;
		vec[i] = make_pair(i, temp);
	}


	sort(vec.begin() + 1, vec.end(), cmp);
	int i = 0;

	while (i < k)
	{
		int low = vec[1].second;
		int high = vec[vec.size() - 1].second;
		if (low == high)
			break;
		vec[vec.size() - 1].second--;
		vec[1].second++;
		res.push_back(pair<int, int>(vec[vec.size() - 1].first, vec[1].first));
		sort(vec.begin() + 1, vec.end(), cmp);
		i++;
	}

	cout << vec[vec.size() - 1].second - vec[1].second << " " << i << endl;
	for (auto it : res)
	{
		cout << it.first << " " << it.second << endl;
	}
	return 0;

}