Bear and Three Ballr
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u
Limak is a little polar bear. He has n balls, the i-th ball has size ti.
Limak wants to give one ball to each of his three friends. Giving gifts isn't easy — there are two rules Limak must obey to make friends happy:
No two friends can get balls of the same size.
No two friends can get balls of sizes that differ by more than 2.
For example, Limak can choose balls with sizes 4, 5 and 3, or balls with sizes 90, 91 and 92. But he can't choose balls with sizes 5, 5 and 6 (two friends would get balls of the same size), and he can't choose balls with sizes 30, 31 and 33 (because sizes 30 and 33 differ by more than 2).
Your task is to check whether Limak can choose three balls that satisfy conditions above.
Input
The first line of the input contains one integer n (3 ≤ n ≤ 50) — the number of balls Limak has.
The second line contains n integers t1, t2, ..., tn (1 ≤ ti ≤ 1000) where ti denotes the size of the i-th ball.
Output
Print "YES" (without quotes) if Limak can choose three balls of distinct sizes, such that any two of them differ by no more than 2. Otherwise, print "NO" (without quote")
Sample Input
Input
4
18 55 16 17
Output
YES
Input
6
40 41 43 44 44 44
Output
NO
Input
8
5 972 3 4 1 4 970 971
Output
YES
----------
1.题意:求以所给数列中是否有三个连续的整数,如果有则输出YES,否则输出NO。
2.思路:将数组排序,去重,然后如果存在相邻的三个数连续,则为YES,否则输出NO.
3.失误:忘记了去重,卡了好多遍呀!!!代码1为当时写的,2是修改后的,明显1容易出错,数据较烦乱。
代码如下:
1.
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int a[3333] ;
int main()
{
int i,j,k,m,n,cnt,t,l;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;++i)
{
cin>>a[i];
}
t=1;
sort(a+1,a+n+1);
for(i=1;i<n;++i)
{
while(a[i]==a[i+1])//忘记啦重数 好多遍了
{
++i;//
}
if(a[i]==a[i+1]-1)
{
++t;
}
else
{
t=1;
}
if(t>=3)
{
break;
}
}
if(t>=3)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
return 0;
}
```
----------
```
2.
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int a[3333] ;
int main()
{
int i,j,k,m,n,cnt,t,l;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;++i)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(i=1;i<n;++i)
{
if(a[i]==a[i+1])//也可以通过再开一数组保存去重后的数列
{
a[i]=0;
}
}
sort(a+1,a+n+1);
i=1;
while(a[i]==0)
{
++i;
}
t=0;
for(;i<=n-3;++i)
{
if(a[i+2]-a[i]==2)
{
cout<<"YES"<<endl;
t=1;
break;
}
}
if(t==0)
{
cout<<"NO"<<endl;
}
}
return 0;
}` `
时过一月半,再来写这题还是卡,最后还是放弃到最后才发现bug在哪,其实想的太多了,也没有充分利用题中的条件,不够灵活,bug肯定会有,关键是发现他的速度;
再次写的代码(多次才过):
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000+88];
int main()
{
int N,i;
while(~scanf("%d",&N))
{
for(i=1;i<=N;++i) scanf("%d",&a[i]);
sort(a+1,a+N+1);
int top=unique(a+1,a+N+1)-a;
bool flag=false;
i=1;
while(i<top-2)//没想到top-2数组越界之后可能会成立
{
if(a[i]+2==a[i+2])
{
flag=true; break;
}
++i;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
听学长提示后写的(充分利用了题目的条件和要求,并且思路没有绕那么多的弯 ,当然也不会出现其他的bug):
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000+88];
int main()
{
int N,i,j,k;
while(~scanf("%d",&N))
{
for(i=1;i<=N;++i) scanf("%d",&a[i]);
bool flag=false;
sort(a+1,a+N+1);
for(i=1;i<=N;++i)
{
for(j=i+1;j<=N;++j)
{
if(a[i]+1==a[j])
for(k=j+1;k<=N;++k)
{
if(a[j]+1==a[k])
{
flag=true; break;
}
}
if(flag) break;
}
if(flag) break;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}

本文解析了一道关于选择三个符合条件的球的问题,利用排序和去重的方法来判断是否存在这样的三个球,使得任意两个球的大小之差不超过2。文章提供了两种实现思路及代码示例。

被折叠的 条评论
为什么被折叠?



