2020百度之星 初赛二 1002 Distance 找规律 有问题的代码

Distance Accepts: 826
Submissions: 2880
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description

小沃沃所在的世界是一个二维平面。他有 nnn 个朋友,第 iii 个朋友距离他的距离为 a[i]a[i]a[i],小沃沃并不知道这些朋友具体在什么点上。

请问在最优情况下,小沃沃的朋友两两之间的欧几里得距离的和的最小值是几?

假设小沃沃的位置为 P0=(x0,y0)P_0 = (x_0,y_0)P0​=(x0​,y0​),第 iii 个朋友的位置为 Pi=(xi,yi)P_i = (x_i,y_i)Pi​=(xi​,yi​),对于所有的 iii,需要满足 dist(P0,Pi)=a[i]dist(P_0, P_i) = a[i]dist(P0​,Pi​)=a[i],并且∑i=1n−1∑j=i+1ndist(Pi,Pj)\sum_{i=1}{n-1}{\sum_{j=i+1}{n}{dist(P_i,P_j)}}∑i=1n−1​∑j=i+1n​dist(Pi​,Pj​) 最小,其中 dist(X,Y)dist(X,Y)dist(X,Y) 为连接点 XXX 和点 YYY 的线段的长度。xi,yix_i,y_ixi​,yi​ 都可以是任意实数。
Input

第一行一个正整数 test(1≤test≤10)test(1 \leq test \leq 10)test(1≤test≤10) 表示数据组数。

对于每组数据,第一行一个正整数 n(1≤n≤100000)n(1 \leq n \leq 100000)n(1≤n≤100000)。

接下来一行 nnn 个整数,第 iii 个整数 aia[i](1 \leq a[i] \leq 1000000000)ai 表示第 iii 个朋友和小沃沃的距离。
Output

对每组数据输出一行一个数,表示 ∑i=1n−1∑j=i+1ndist(Pi,Pj)\sum_{i=1}{n-1}{\sum_{j=i+1}{n}{dist(P_i,P_j)}}∑i=1n−1​∑j=i+1n​dist(Pi​,Pj​) 的最小值。答案需要四舍五入到整数。
Sample Input

2
2
3 5
5
1 2 3 4 5

Sample Output

2
20


很容易想到所有点在同一条直线上才能得到最优的答案
如图
在这里插入图片描述
可以观察到规律

      ①    ②     ③     ④     ⑤    ⑥
--------------------------
2:个点 1
3个点: 2    2
4个点: 3    4      3
5个点: 4    6      6      4
6个点: 5    8      9      8      5
7个点: 6   10     12     12     10    6
这题有一个奇怪的地方,希望有大佬看见能指点一二
如下 : 如果不加括号可以ac,加了就wa
  • sum += (a[i+1] - a[i]) * (i * ( n - i ) );这个会wa
  • sum += (a[i+1] - a[i]) * i * (n - i);这个就能ac
#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif

#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>

#define MAXN (int(1e6+7))
#define ll long long
#define INF (0x7f7f7f7f)
#define fori(lef, rig) for(int i=lef; i<=rig; i++)
#define forj(lef, rig) for(int j=lef; j<=rig; j++)
#define fork(lef, rig) for(int k=lef; k<=rig; k++)
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...)                                 \
	do {                                           \
		cout << "\033[31;1m " << #x << " -> ";     \
		err(x);                                    \
	} while (0) 
#else
#define show(x...)  
#endif

void err() { cout << "\033[39;0m" << endl; }
template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }

namespace FastIO {

	char print_f[105];
	void read() { }
	void print() { putchar('\n'); }

	template <typename T, typename... T2>
		inline void read(T &x, T2 &... oth) {
			x = 0;
			char ch = getchar();
			ll f = 1;
			while (!isdigit(ch)) {
				if (ch == '-') f *= -1; 
				ch = getchar();
			}
			while (isdigit(ch)) {
				x = x * 10 + ch - 48;
				ch = getchar();
			}
			x *= f;
			read(oth...);
		}
	template <typename T>
		inline void put(T x) {
			if(x==0) { putchar('0'); putchar('\n'); return; }
			if(x<0) { putchar('-'); x = -x; }
			int num=0;
			char ch[128];
			while(x) ch[++num] = x % 10 + '0', x /= 10;
			while(num) putchar(ch[num--]);
			putchar('\n');
		}
}; // namespace FastIO
using FastIO::read;
using FastIO::put;

int n, m, Q, K, tmin = INF;

ll a[MAXN], b[MAXN], c[MAXN];

signed main() {
#ifdef debug
	freopen("test", "r", stdin);
//	freopen("out_main", "w", stdout);
	clock_t stime = clock();
#endif
	read(Q);
	while(Q--) {
		read(n);
		for(int i=1; i<=n; i++) read(a[i]);
		sort(a+1, a+1+n);
		ll sum = 0;
#if 1
		for(int i=1; i<n; i++) //不能 AC
			sum += (a[i+1] - a[i]) * (i * ( n - i ) );
#else
		for(int i=1; i<n; i++)
			sum += (a[i+1] - a[i]) * i * (n - i);
#endif
		printf("%lld\n", sum);
	}




#if 0
		for(int i=n-1, timer=1; i>=1; i--, timer++) {
			c[i] = timer * i;
		}
#endif









#ifdef debug
	clock_t etime = clock();
#endif 
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值