NumbersTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/262144 K (Java/Others)Total Submission(s): 283 Accepted Submission(s): 185
Problem Description
There are n numbers A1,A2....An,your
task is to check whether there exists there different positive integers i, j, k (1≤i,j,k≤n)
such that Ai−Aj=Ak
Input
There are multiple test cases, no more than 1000 cases.
First line of each case contains a single integer n.(3≤n≤100). Next line contains n integers A1,A2....An.(0≤Ai≤1000)
Output
For each case output "YES" in a single line if you find such i, j, k, otherwise output "NO".
Sample Input
Sample Output
|
题意:给定一个 n个元素的序列,问你是否存在三个元素A、B、C满足 A = B + C。
时间复杂度最坏为 1000 * O(100*100*100),不知道为什么1s可以过。。。
思路:用一个数组vis记录某元素是否出现,用数组num记录元素出现个数,然后100*100逐个判断就可以了。
AC代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define MAXN 110
using namespace std;
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a%b);
}
int a[MAXN];
bool vis[1010];
int num[1010];
int main()
{
int n, kcase = 1;
while(scanf("%d", &n) != EOF)
{
memset(vis, false, sizeof(vis));
memset(num, 0, sizeof(num));
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
vis[a[i]] = true;
num[a[i]]++;
}
sort(a, a+n);
bool flag = false;
for(int i = 0; i < n; i++)
{
if(flag)
break;
for(int j = i+1; j < n; j++)
{
if(flag)
break;
int temp = a[j] - a[i];
if(vis[temp])
{
if(temp != a[j] && temp != a[i])
flag = true;
if(temp == a[j] && temp == a[i] && num[temp] > 2)
flag = true;
else if(temp == a[j] && num[temp] > 1)
flag = true;
else if(temp == a[i] && num[temp] > 1)
flag = true;
}
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}