刷题记录:NC15322强迫症的序列

传送门:牛客
题目描述:

小A是一个中度强迫症患者,每次做数组有关的题目都异常难受,他十分希望数组的每一个元素都一样大,这样子看起来才
是最棒的,所以他决定通过一些操作把这个变成一个看起来不难受的数组,但他又想不要和之前的那个数组偏差那么大,
所以他每次操作只给这个数组的其中n-1个元素加1,但是小A并不能很好的算出最优的解决方案,如果你能帮他解决这个
问题,小A就能送你一个气球
输入:
1
3
1 2 3
输出:
3 4

主要思路:

  1. 这道题刚开始我没有想到很好的一个解决思路,看了一眼难度竟然是1星题,然而我感觉似乎有点复杂,当时我是这么思考的,显然我们应该每次都将最少的几个加加,这就需要我们每次累加之后都需要一个排序,感觉似乎成为了一道平衡树的他题目,实现起来有一点点的麻烦,先不说对于n=100000会不会超时,对于一道一星题,我肯定是不愿意话时间去这么做出.
  2. 然后我仔细看了一下题目,题目中描述增加元素的个数是全部元素个数减一,这时我们用离散的思想思考了一下就会发现,其他的值增加不就等于将另外的一个数的值减少一吗,这样来说的话那么事情就变得简单了起来,如果将modify的方式改成将一个数减少1的话,就直接排个序累加一下差值就可以轻松解决,还有因为贪心的思想,我们肯定是以最小的那一个作为基准线的,因此每一次减少的时候最小的那一个我们是不做改变的,因此最后的相同元素我们反过来得到的就是最小到元素加上改变的次数
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	ll x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
#define maxn 1000000
int T;
int a[100005];
int main() {
	T=read();
	while(T--) {
		memset(a,0,sizeof(a));
		int n;n=read();
		for(int i=1;i<=n;i++) a[i]=read();
		sort(a+1,a+n+1);
		int sum=0;
		for(int i=2;i<=n;i++) {
			sum=sum+a[i]-a[1];
		}
		printf("%d %d\n",sum,a[1]+sum);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值