题目描述
小易有一些立方体,每个立方体的边长为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, 最小+1
存在:左右一直不能平衡的问题;计算max 和min的差值,看操作后两者是否相同;
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
pair<int, int>FindNums(vector<int>A)
{
int len = A.size();
if(len<=0) return make_pair(0,0);
int maxValue=0, minValue=0;
for(int i=1; i<len; i++)
{
maxValue = A[maxValue]>=A[i]?maxValue:i;
minValue = A[minValue]<=A[i]?minValue:i;
}
return make_pair(minValue, maxValue);
}
int main()
{
int n,k;
cin>>n>>k;
vector<int>A(n, 0);
for(int i=0; i<n; i++)
{
cin>>A[i];
}
int s=0, m=1;
vector<vector<int>>ans;
pair<int, int>op = FindNums(A);
while( (m<=k) && (A[op.second] - A[op.first] >1))
{
A[op.second] -= 1;
A[op.first] += 1;
vector<int>tmp; tmp.push_back(op.second); tmp.push_back(op.first);
ans.push_back(tmp);
op = FindNums(A);
m++;
}
s = A[op.second] - A[op.first];
if(m>k) m=m-1;
cout<<s<<" "<<m<<endl;
for(int i=0; i<ans.size(); i++)
cout<<ans[i][0]+1<<" "<<ans[i][1]+1<<endl;
return 0;
}
运行时间:6ms
占用内存:404k