Telephon(暴力解决)
题目简介:
精神病院有一个这样的测试。
给出一个正整数集合,集合中的数各不相同,然后要求病人回答:
其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
回答正确的人,即可以出院。
但是,条件是苛刻的——
一秒。
直到变成废墟前,也没有人从中逃出。
但是如今不同了。
对吧?
Input
共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。
第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。
Output
一个整数,表示测验题答案。
Examples
telephone.in 4
telephone.out 1 2 3 4 2
Notes
对于所有数据,满足 3 ≤ n ≤ 5000,给出的正整数不超过 10000。 Task1[50%] n ≤ 100 Task2[100%]
无特殊限制
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int a[5001],b[20001]; int main() { int n,ans=0; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) b[a[i]+a[j]]=1; for(int i=1;i<=n;i++) { if(b[i]==1) ans++; } cout<<ans; return 0; }
思路:
很容易想到O(n三方)算法;
三重循环暴力枚举
但是5000在那,你怎么都会被T掉。
用两重循环才能过。
机缘巧合顺理成章地想到桶排。
将能够得到到的数存起来。
这样就快的多。