Codeforces Round #198 (Div. 2) —— C

C题很容易看懂题目,不过两个循环肯定会TLE,所以得用点小聪明;

首先排好序,因为是全排列,乱序和顺序的结果是一样的;

然后呢····

如果是数列 1 2 3 4 5

元素1 被 2 3 4 5每个减了2次,它自己减0一次;相抵后为-7;

元素2 被 3 5 4 每个减了2次,它减1两次,减0一次;相抵后为 -3;

元素3 相抵后为1;

可以发现他们的数量相差4;这样就好办了,一个循环就搞定了;

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int a[100009];
 6 long long gcd(long long a,long long b)
 7 {
 8     return b==0?a:gcd(b,a%b);
 9 }
10 int main()
11 {
12     long long ans=0,n,t;
13     cin>>n;
14     for(long long i=0; i<n; i++)
15         scanf("%d",&a[i]);
16     sort(a,a+n);
17     t=3-2*n;
18     for(long long i=0; i<n; i++,t+=4)
19         ans+=a[i]*t;
20     long long k=gcd(ans,n);
21     cout<<ans/k<<" "<<n/k<<endl;
22     return 0;
23 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3293173.html