zoukankan      html  css  js  c++  java
  • HDU 5734 A

    http://acm.hdu.edu.cn/showproblem.php?pid=5734 
    Problem 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 


    1 2 3 4 

    2 2 2 2 

    5 6 2 3 4

    Sample Output 
    5/1 
    0/1 
    10/1

    Author 
    zimpha

    题目,给你一堆数字,要求你选定一个数,然后要使得这堆数字中每个数减去/加上这个数字后,剩下的数的平方和最小。

    首先把公式展开,得到的是w^2 + a^2*B^2 - 2a*B*w

    然后要使这个式子值最小,就要减号那部分的东西最大,那么因为w中有负数而且B的值只能是-1和+1,那么B就用来修正w的符号,使得w全是正数。然后根据一个关于a的二次函数,在对称轴上取得最小 。sum2是w的abs相加

    最小值是 sum1(数字的平方和) - (sum2)*(sum2)/n

    因为有可能sum2*sum2是不能整除n的,那么把整个式子乘上一个n,最后输出的时候和n的gcd约去即可。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    #define inf (0x3f3f3f3f)
    typedef long long int LL;
    
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    LL gcd (LL n,LL m)
    {
        if (n%m==0) return m;
        else return gcd(m,n%m);
    }
    void work ()
    {
        int n;
        scanf("%d",&n);
        LL sum1 = 0,sum2 = 0;
        for (int i=1;i<=n;++i)
        {
            LL x;
            scanf("%I64d",&x);
            sum1 += x*x;
            sum2 += abs(x);
        }
        LL ansn = n*sum1 - (sum2*sum2);
        LL GCD = gcd(ansn,1LL*n);
        printf ("%I64d/%I64d
    ",ansn/GCD,n/GCD);
        return ;
    }
    int main()
    {
    #ifdef local
        freopen("data.txt","r",stdin);
    #endif
        int t;
        scanf("%d",&t);
        while (t--) work();
        return 0;
    }
    View Code
  • 相关阅读:
    TCP 协议三次握手过程解析带实例
    一些关于反汇编与逆向方面的博文分享
    关于mwArray和一般数组的区别
    vc6.0 使用Ado 连接MS-SqlServer2000 连接字符串
    VC6使用技巧
    Oracle性能诊断艺术-读书笔记(执行计划中显示 Starts, E-Rows, REM A-Rows and A-Time)等)
    Oracle性能诊断艺术-读书笔记
    linux 检查补丁包是否安装 名称 版本 release号
    我叫他小北
    Oracle linux安装Oracle 11G
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/5789009.html
Copyright © 2011-2022 走看看