[UPC](7221)Flower ---- 逆向思维+规律 ★

版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/82390045

题目链接

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;
}

猜你喜欢

转载自blog.csdn.net/m0_37624640/article/details/82390045