Hint: 2018黑龙江省赛
做法:比赛时,和小伙伴被这个题卡了一个半小时……
赛后又跟超霸学习到了_(:з」∠)_
- 首先,我们知道可行的解一定是1 x x x x ……
- 由一不定的情况去找可行解复杂,但由可行解去逆推初始情况,找规律,是非常机智的~
- 比如:1 2 2 2 2
- 我们每次随便固定一个数不变,变成2 2 3 3 3 ----> 3 2 4 4 4
- 一定有一个最大的数,是一直在变化的,那么这个最大数,相比于最小的数之外的数,每次加1,次数就是 sum = ∑a(max) - a[i]
- 比如2 3 4 4 4,中4 相比于第二个数3,多1,说明变化了1次,然后最大的数相比于最小的数,多2,就相比于最小的数,也变化了2次。 所以ans = 1+2 = 3
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 1e8+5;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f3f;
int a[maxn];
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
#endif // LOCAL_FILE
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
ll sum = 0;
for(int i=1;i<n;i++) sum = sum+a[n-1]-a[i];
cout<<sum<<endl;
if(a[0]<=sum) printf("-1\n");
else
{
ll ans = sum+a[n-1]-a[0];
printf("%lld\n",ans);
}
}
return 0;
}