D. Range = √Sum(Codeforces Round 836 (Div. 2))

41 篇文章 0 订阅
40 篇文章 0 订阅

题目地址:

Problem - D - Codeforcesicon-default.png?t=N2N8https://codeforces.com/contest/1758/problem/D

题意:

给你一个数字n,你需要构建出一个大小为n的数组,使得max(a1,a2,...an)-min(a1,a2...an)=\sqrt{a1+a2+a3+....+an},这个\sum_{i=1}^{i=n}ai必须是一个完全平方数,并不是强制转化为int类型的。

思路:

这个题可以分成是两种情况(n为奇数和偶数来考虑):

第一种:偶数的话,直接利用n个数的和为n*n,其实就是n为中数,以及平均数,因为是偶数个,所以思考一下,n是不应该出现在数组中的,所以就是n-(n/2)~n-1,以及n+1~(n+n/2).举个例子:当n为6的时候 ,数组应该是3 4 5 7 8 9,这样,一定是满足的。

第二种:奇数的话,肯定是和偶数不一样的,奇数我们可以这样,因为连续的自然数长度为n的数组,最大值-最小值=n-1,所以我们可以选择n+2作为中数,连续的n+2个连续的数,所以这个数组的和为(n+2)*(n+2),这个长度为n+2的数组最大值-最小值=(n+1),因为我们构造出来长度数组需要为n,可以使该数组的和为(n+1)*(n+1),所以最后的数组就是这个长度为(n+2)的数组里面减去2个和为(n+2)*(n+2)-(n+1)*(n+1). 根据数论[(n+2)*(n+2)-(n+1)*(n+1)]/2 一定是在改数组面,所以就是当i!=[(n+2)*(n+2)-(n+1)*(n+1)]/2和i!=[(n+2)*(n+2)-(n+1)*(n+1)]/2+1的时候输出就行了,其他的n个数输出就行。

AC代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N];
void solve(){
	int n;
	cin>>n;
	if(n%2==1){
		n+=2;
		int op=n*n-(n-1)*(n-1);
		op/=2;
		for(int i=n-n/2;i<=n+n/2;i++){
			if(i!=op&&i!=op+1){
				cout<<i<<" ";
			}
		}
		cout<<"\n";
	}
	else {
		for(int i=n-n/2;i<=n-1;i++){
			cout<<i<<' ';
		}
		for(int i=n+1;i<=n+n/2;i++){
			cout<<i<<" ";
		}
		cout<<"\n";
		return ;
	}
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	while(t--){
		solve();
	}
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值