您的位置:首页 > 大数据 > 人工智能

【HDU5734 2016 Multi-University Training Contest 2A】【公式代入推导】Acperience n维向量各有加减最小模长

2016-07-28 09:50 531 查看

Acperience

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 993    Accepted Submission(s): 532


[align=left]Problem Description[/align]
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)).
 

[align=left]Input[/align]
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).
 

[align=left]Output[/align]
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.
 

[align=left]Sample Input[/align]

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

 

[align=left]Sample Output[/align]

5/1
0/1
10/1

 

[align=left]Author[/align]
zimpha
 

[align=left]Source[/align]
2016 Multi-University Training
Contest 2

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
const int N = 100010, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;
int casenum, casei;
LL n;
LL a
;
LL gcd(LL x, LL y)
{
return y == 0 ? x : gcd(y, x%y);
}
/*
n * ∑(wi^2) - (∑|wi|)^2 (1e18-1e16)
-----------------------------------
n
*/
int main()
{
scanf("%d", &casenum);
for (casei = 1; casei <= casenum; ++casei)
{
LL a = 0;
LL b = 0;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
LL x; scanf("%lld", &x);
a += x*x;
b += abs(x);
}
LL top = n*a - b*b;
LL bot = n;
LL g = gcd(top, bot);
printf("%lld/%lld\n", top/g, bot/g);
}
return 0;
}
/*
【trick&&吐槽】
1,很多题目看起来很冗杂,
其实我们读重点的话,就会发现题目是可以入手的。
比赛的时候也不能放弃题目阅读,往往藏了很多简单题。

2,一定要注意数据上限,队友推出了一个爆LL的错误公式

3,java做大数运算是很耗时间的,尽量规避。

【题意】
给你一个n维向量a,
然后我们希望对a向量的每个维度都加减一个相同的值,
使得得到的目标向量b的模尽可能小。

【类型】
公式化简

【分析】
如何做公式化简?
先一股脑地做代入!
(w1-ab1, w2-ab2, ... , wn-ab3),然后得到——
原式=
(w1-ab1)^2
+(w2-ab2)^2
+(w3-ab3)^2
...
+(wn-abn)^2
=(w1^2+...+wn^2)[定值] + (a^2)*(b1^2+b2^2+...+bn^2) - 2a(w1b1+w2b2+...+wnbn)
=[定值]+(a^2)*n-(2a)*(w1b1+w2b2+...+wnbn)
我们希望使其尽可能小,
显然 要使得(w1b1+w2b2+...+wnbn)尽可能大,这个很容易做的。使其变为了给定的定值。

然后,我们最后需要考虑的是一个
(x^2)*n-2x*[定值]+[定值]的一元二次方程。
显然,其最小值为
b^2 (∑|wi|)^2 n * ∑(wi^2) - (∑|wi|)^2 (1e18-1e16)
c- ---- = ∑(wi^2) - ---------- = ----------------------------
4a n n

【时间复杂度&&优化】
O(n)

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐