網易 [程式設計題] 塔
阿新 • • 發佈:2018-12-25
[程式設計題] 塔
時間限制: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; }