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

题目链接

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值