zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",ans1,ans2);
        */
    }
    int main(){
        int t;
        scanf("%d",&t);
        while(t--)solve();
        return 0;
    }
  • 相关阅读:
    0015 Java学习笔记-集合-TreeMap集合
    0014 Java学习笔记-集合-HashMap集合
    0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
    0012 win7x64安装CentOS7
    0011《SQL必知必会》笔记07 数据的插入、更新和删除
    0010《SQL必知必会》笔记06-表的修改与删除
    0009《SQL必知必会》笔记05-表的创建与约束
    0008《SQL必知必会》笔记04-子查询、联接与组合查询
    0007《SQL必知必会》笔记03-汇总与分组数据
    0006 《SQL必知必会》笔记02-计算字段与函数
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5692857.html
Copyright © 2011-2022 走看看