结论题,一直在猜结论。
分几种情况讨论。
设
m
a
x
n
maxn
maxn为看到数量的最大值,
m
i
n
n
minn
minn为看到数量的最小值。
1.
m
a
x
n
−
m
i
n
n
>
1
1.maxn-minn>1
1.maxn−minn>1 直接输出No。
2.
m
a
x
n
=
=
m
i
n
n
2.maxn==minn
2.maxn==minn
(
1
)
m
i
n
n
=
=
n
−
1
(1)minn==n-1
(1)minn==n−1输出Yes
(
2
)
m
i
n
n
>
n
−
1
(2)minn>n-1
(2)minn>n−1输出No
(
3
)
m
i
n
n
∗
2
≤
n
(3)minn*2\le n
(3)minn∗2≤n输出Yes
(
4
)
(4)
(4)否则输出No
因为不可能同时有若干个人在同一组,一些人单独一组,否则
m
a
x
n
≠
m
i
n
n
maxn\ne minn
maxn=minn。
所以必须满足每个组至少两个人。所以
m
i
n
n
∗
2
≤
n
minn*2\le n
minn∗2≤n。
3.
m
a
x
n
=
=
m
i
n
n
+
1
3.maxn==minn+1
3.maxn==minn+1
设有
t
o
t
tot
tot个人为
m
i
n
n
minn
minn。则这些人单独一组。可以算出总组数为
s
=
m
i
n
n
−
t
o
t
+
1
s=minn-tot+1
s=minn−tot+1。
(
1
)
s
<
1
(1)s<1
(1)s<1输出No
(
2
)
s
∗
2
≤
n
−
t
o
t
(2)s*2\le n-tot
(2)s∗2≤n−tot输出Yes。原因见上文。
(
3
)
(3)
(3)否则输出No。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=100005;
int n,tot,s,a[N];
set<int> st;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
st.insert(a[i]);
}
sort(a+1,a+n+1);
if(st.size()>2||a[n]-a[1]>1){
puts("No");
return 0;
}else if(a[n]-a[1]==0){
if(a[n]==n-1){
puts("Yes");
}else if(a[n]>n-1){
puts("No");
}else if(a[n]*2<=n){
puts("Yes");
}else{
puts("No");
}
return 0;
}
for(int i=1;i<=n;i++){
if(a[i]==a[1]){
tot++;
}
}
s=a[1]-tot+1;
if(s<1){
puts("No");
}else if(s*2<=n-tot){
puts("Yes");
}else{
puts("No");
}
return 0;
}