FJUT 3891 思维

原题网址:http://www.fjutacm.com/Problem.jsp?pid=3891

Hang有点强迫症,就是他比较喜欢每个数都是一样的数组,所以Hang希望经过一些操作来使得一个数组变成他喜欢的数组,Hang每次操作需要选择数组中n-1个数,使他们的值+1,Hang想知道他最少需要进行多次操作

Input
第一行一个整数T(T<=100),表示组数

对于每组数据有一个n,表示序列的长度(0< n <100000)

下面一行有n个数,表示每个序列的值(0<ai<100000)

Output
对于每组数据,输出两个数

第一个数表示最小的操作步数

第二个数经过若干步以后的数组元素是什么,用一个空格隔开

SampleInput
2
3
2 2 3
2
1 1
SampleOutput
1 3
0 1

一个不错的思维题 :
每次操作给n-1个数+1 <—> 我们把没选的那个数-1 让所有数一样 那么肯定选大的数去减 一直减到和min一样
那么操作次数就很好说了 就是Σ(ai-min)
那么最后的值呢? 继续前面的思路往下走 我们每次进行-1的数都是比min大的数 那么再把思路转换回去 也就是说每次操作min都处于+1的那n-1个数中的一个 所以最后的数就是min+Σ(ai-min)


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005];
int main()
{
    int t;
    cin>>t;
    while(t--){
        ll n,mi=1LL<<62,sum=0;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i],sum+=a[i],mi=min(mi,a[i]);
        cout<<sum-n*mi<<" "<<sum-n*mi+mi<<endl;
    }
    return 0;
}

发布了58 篇原创文章 · 获赞 12 · 访问量 7476

猜你喜欢

转载自blog.csdn.net/qq_43563669/article/details/99687185