hdu 5734 Acperience 水题

Acperience

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5734

Description

Deep neural networks (DNN) have shown significant improvements in several application domains including computer vision and speech recognition. In computer vision, a particular type of DNN, known as Convolutional Neural Networks (CNN), have demonstrated state-of-the-art results in object recognition and detection.

Convolutional neural networks show reliable results on object recognition and detection that are useful in real world applications. Concurrent to the recent progress in recognition, interesting advancements have been happening in virtual reality (VR by Oculus), augmented reality (AR by HoloLens), and smart wearable devices. Putting these two pieces together, we argue that it is the right time to equip smart portable devices with the power of state-of-the-art recognition systems. However, CNN-based recognition systems need large amounts of memory and computational power. While they perform well on expensive, GPU-based machines, they are often unsuitable for smaller devices like cell phones and embedded electronics.

In order to simplify the networks, Professor Zhang tries to introduce simple, efficient, and accurate approximations to CNNs by binarizing the weights. Professor Zhang needs your help.

More specifically, you are given a weighted vector W=(w1,w2,...,wn). Professor Zhang would like to find a binary vector B=(b1,b2,...,bn) (bi∈{+1,−1}) and a scaling factor α≥0 in such a manner that ∥W−αB∥2 is minimum.

Note that ∥⋅∥ denotes the Euclidean norm (i.e. ∥X∥=x21+⋯+x2n−−−−−−−−−−−√, where X=(x1,x2,...,xn)).

Input

There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:

The first line contains an integers n (1≤n≤100000) -- the length of the vector. The next line contains n integers: w1,w2,...,wn (−10000≤wi≤10000).

Output

For each test case, output the minimum value of ∥W−αB∥2 as an irreducible fraction "p/q" where p, q are integers, q>0.

Sample Input

3
4
1 2 3 4
4
2 2 2 2
5
5 6 2 3 4

Sample Output

5/1
0/1
10/1

Hint

题意

让你构造一个β向量,里面的每一维都是1或者-1

然后使得W - αβ的方差最小。

题解:

首先,我们让W中所有为负的,都变成正数,这样我们就相当于把β都当成1了,接下来就开始考虑阿尔法的问题。

把方差的平方项打开,很清楚的看见当阿尔法取平均数的时候就是最小值,这个结论也很容易猜到,所以直接莽一波就好了。

但是答案会爆longlong,所以要么你化简那个式子,要么你就高精度。

我推荐把平方项打开,然后合并就好了。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
long long a[maxn];
int n;
long long gcd(long long aa,long long bb){
    if(bb==0)return aa;
    return gcd(bb,aa%bb);
}
void solve(){

    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%I64d",&a[i]);
        if(a[i]<0)a[i]*=-1;
    }
    long long sum = 0,down = 0;
    for(int i=1;i<=n;i++){
        sum = sum + a[i];
    }
    long long ans1 = 0;
    for(int i=1;i<=n;i++){
        ans1 = ans1 +   n * a[i] * a[i];
    }
    ans1 = ans1 -   sum * sum;
    long long ans2 =   n;
    long long g = gcd(ans1,ans2);
    ans1/=g,ans2/=g;
    printf("%I64d/%I64d\n",ans1,ans2);

    /*
    long long g = gcd(up,down);
    up/=g,down/=g;


    long long ans1 = a[1]*down - up;
    long long ans2 = down;
    g = gcd(ans1,ans2);
    ans1/=g,ans2/=g;
    ans1 = ans1 * ans1;
    ans2 = ans2 * ans2;

    for(int i=2;i<=n;i++){
        long long tmp1 = a[i]*down - up;
        long long tmp2 = down;
        g = gcd(tmp1,tmp2);
        tmp1/=g,tmp2/=g;
        tmp1 = tmp1 * tmp1;
        tmp2 = tmp2 * tmp2;

        long long Tmp1 = ans1*tmp2+ans2*tmp1;
        long long Tmp2 = tmp2*ans2;
        g = gcd(Tmp1,Tmp2);
        Tmp1/=g,Tmp2/=g;
        ans1 = Tmp1;
        ans2 = Tmp2;

    }
    printf("%I64d/%I64d\n",ans1,ans2);
    */
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--)solve();
    return 0;
}
posted @ 2016-07-21 19:04  qscqesze  阅读(464)  评论(0编辑  收藏  举报