题目意思:
给5组数,每组含n个数(n<=200),在5组数中各选一个,问是否存在一种组合使这5个数的和为0。
解题思路:
这题数据很强,o(n^3*lgn过不了)
对于在两组数各选一个使得和为定值,有一种贪心的算法,时间复杂度为(n*lgn,实际上就是排序的算法时间复杂度)。
所以可以把第二组和第三组数合并组合40000个数作为第二组,第四组和第五组合并成40000个数作为第三组。
分别排序。
1、然后枚举第一组,初始时用p指针指向第二组中的第一个数,q指针指向第三组的最后一个数,以第二组为基准。
2、当三数大于0时,说明q指针后面的所有数与p指针后面的数肯定不行,大于当前的和值,同时说明p指针后面的只可能和q指针前面的凑,所以q指针往前移。
3、当三数小于0时,说明p与当前的q不行,p与q后面的也不行(由上一步得),p与q前面的更不行。所以p只能往后移。
贪心思想,所以最多只移动了40000+40000次。
所以总的时间复杂度为o(n^3).
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include