两个N维向量的点积定义为,对应维度上的数的乘积之和。
两个三维向量[1, 3, −5]和[4, −2, −1]的点积是1 * 4 + 3 * (-2) + (-5) * (-1) = 3
现在允许我们对两个向量里的维度重新排列,让点积尽可能小。
例如上述两个向量,我们可以调整维[3,1,-5]和[-2,-1,4],点积是-27。
输入格式:
多组数据,每组数据第一行是一个整数n,表示向量的维数。1<=n<=100000。
下面两行,每行是n个空格分隔的整数表示两个n维向量,每一维的范围都是[-1000000,+1000000]之间。
输出格式:
对于每组数据,输出一行,包含一个整数,代表可以调整到的最小的点积。
输入样例
3
3 1 -5
-2 -1 4
输出样例:
-27
思路:考虑二维向量,对于向量a,b ab=cos(c)*|a|*|b|. 而|a|,|b|的大小是不会变的,因此为了使ab尽量小,则需要使 cos(c)尽可能小。(c为向量a,b的夹角)
现在就是考虑什么样的情况下,夹角最大呢?
就是当向量a的维度是从小到大排列,而向量b的维度是相反的顺序:从大到小排列时,他们的夹角最大。证明过程给不出。
所以呢,我们只需要对向量a,b进行排序,一个从小到大排序,一个从大到小排序,然后再相乘,就可以得出最小的值了。
由于涉及的数据可能会超过32位,因此使用__int64来进行存储,也可以使用double.
代码略。
给你一个长度为n的正整数序列A1,A2,A3...An,请你求出有多少个独特区间,独特区间就是一个连续的并且区间里的每个数都不相同的子序列。
例如:1 2 3 答案就是6,因为每个数都不行同。 1 2 2 答案是4
输入描述:
输入包含多组测试数据,每组测试数据包含两行,第一行为一个正整数n(0<n<=1000000);第二行包含n个正整数,每个数都小于2^30,每两个数以空格隔开。
输出描述:
对于每组测试数据输出相应的答案。
样例输入:
5
3 4 5 5 2
3
1 2 3
样例输出:
9
6
思路:对于长度为n的正整数序列A1,A2,A3...An。分别计算以A1,A2,...An开头的独特区间长度。相加即为答案。
如:2 3 5 5 2
2开头:长度为3(代表区间【2】,【2,3】,【2,3,5】)
3开头,长度为2(代表区间【3】,【3,5】)
5开头,长度为1(代表区间【5】)
5开头,长度为2(代表区间【5】,【5,2】)
2开头,长度为1(代表区间【2】)
累加为9,即为答案
代码略。时间复杂度o(n^2),AC了。