ACM_四数之和
四数之和
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
有n个不同的整数,判断能否从中选4次,4个数和刚好为m。数字可重复选取。
Input:
输入包含多组测试,每组测试第一行是两个数n(1<=n<=1000)和m(0<=m<=10^9)。
第二行是n个数a1,a2,a3...an(0<=ai<=10^8);
Output:
对于每组测试,如果能从中找出4个数和为m,则输出YES,否则输出NO。
Sample Input:
5 10 1 2 3 4 5 3 10 1 3 5 3 9 1 3 5
Sample Output:
YES YES NO
解题思路:因为四数和中选取的每个数字可以重复,因此我们可以先将每每两个数的和存放到set容器中(注意元素具有唯一性即不重复性),然后使用find()来查找set中是否有m-*it这个元素即可,思路清晰,代码可以过,不超时!忽略系数,此解法时间复杂度是O(n^2)。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[1005],n,m; 4 set<int> t; 5 bool findt(int obj){ //find()返回迭代器在容器中的位置 6 return t.find(obj)==t.end(); 7 } 8 int main() 9 { 10 while(cin>>n>>m){ 11 t.clear(); 12 for(int i=0;i<n;++i) 13 cin>>a[i]; 14 for(int i=0;i<n;++i) 15 for(int j=0;j<n;++j) 16 t.insert(a[i]+a[j]); //每每两个数相加 17 bool flag=false; //标记set中是否有这个元素 18 for(set<int>::iterator it=t.begin();it!=t.end();++it) 19 if(!findt(m-*it)){flag=true;break;} 20 if(flag)cout<<"YES"<<endl; 21 else cout<<"NO"<<endl; 22 } 23 return 0; 24 }