C.Minimum Extraction
Yelisey has an array a of n integers.
If a has length strictly greater than 1, then Yelisei can apply an
operation called minimum extraction to it:First, Yelisei finds the minimal number m in the array. If there are
several identical minima, Yelisey can choose any of them. Then the
selected minimal element is removed from the array. After that, m is
subtracted from each remaining element. Thus, after each operation,
the length of the array is reduced by 1.For example, if a=[1,6,−4,−2,−4], then the minimum element in it is
a3=−4, which means that after this operation the array will be equal
to a=[1−(−4),6−(−4),−2−(−4),−4−(−4)]=[5,10,2,0].Since Yelisey likes big numbers, he wants the numbers in the array a
to be as big as possible.Formally speaking, he wants to make the minimum of the numbers in
array a to be maximal possible (i.e. he want to maximize a minimum).
To do this, Yelisey can apply the minimum extraction operation to the
array as many times as he wants (possibly, zero). Note that the
operation cannot be applied to an array of length 1.Help him find what maximal value can the minimal element of the array
have after applying several (possibly, zero) minimum extraction
operations to the array.
题意:找到当前集合内最小的数,然后其他所有数都减去当前的值求,这样的最小值的最大值是多少(确实是最小值中的最大值。。。)
个人思路:把整个数组排序,然后存下每次带走的那个值,由当前的第二第二小值减去,然后在用一个数存下最大值,不用每次都对每一个进行一次计算
(个人思路对了,就没看官方答案)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+10,INF=0x3f3f3f3f;
int a[N];
int main()
{
int T;cin>>T;
while(T--)
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+1+n);
ll idx=0,ans=-INF;
for(int i=1;i<=n;i++)
{
ans=max(ans,a[i]-idx);
// cout<<a[i]<<" "<<idx<<endl;
idx+=(a[i]-idx);
}
printf("%lld\n",ans);
// cout<<endl;
}
return 0;
}
博客讲述了如何使用贪心算法解决Codeforces上的Minimum Extraction问题。作者首先解释了操作过程,即找到数组中最小元素并移除,然后从剩余元素中减去这个最小值。目标是最大化数组中的最小值。通过排序数组并依次减去次小值,可以高效地找出最小值的最大可能值。代码实现也一并给出。

930

被折叠的 条评论
为什么被折叠?



