
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 }