#include<iostream>
using namespace std;
int count(float v[100],int n)
{
int i,nr=0;
float m;
m=(v[0]+v[n-1])/2;
for(i=0;i<n;i++)
if(v[i]>=m)
nr++;
return nr;
}
int main()
{
int i,n,ok=0;
float v[100];
cin>>n;
for(i=0;i<n;i++)
cin>>v[i];
if(v[0]==v[n-1])
ok=1;
if(count(v,n)==2 && ok==1)
cout<<"YES";
else
if(ok==0 && count(v,n)==1)
cout<<"YES";
else
cout<<"NO";
}
该程序应该检查数组中的第一个和最后一个数字是否是该相应数组中的最低值。正如标题所述,这通过将数字与第一个和最后一个数字的算术平均值进行比较来完成
问题是,它没有。无论我输入什么值,它只显示“NO”(意味着这些数字不是最低的)。通过它一百次,但不能真正弄清楚什么是错的...任何帮助将不胜感激。
答案 0 :(得分:1)
第if(ok==0 && count(v,n)==1)
行应为if(ok==0 && count(v,n)== n-1)
。
如果第一个和最后一个不相等,但其中一个是最低的数字,那么count(v,n)
将返回n-1
。
您的示例数据包含6个输入:12 245 654 23 652 11
(第一个+最后一个)/ 2 = 11.5
12,245,654,23和652均大于11.5,因此count(v,n)
返回5 (e.g. n-1)
,表示“最后一个数字中的第一个是最低的”。
修改:最简单的解决方案是修复count()
以检查if(v[i]<=m)
而不是>=
。这样它就会返回小于(第一个+最后一个)/ 2的基准数量。如果first == last,它将返回2,如果第一个!== last,它应该返回1.
答案 1 :(得分:1)
您的算法存在根本缺陷,无法执行您想要的操作(检查第一个和最后一个数字是否是最低的两个)。考虑一下这个数组:
2, 19, 19, 19, 19, 20
除了第一个元素之外的每个元素都大于均值(11
),但最后一个项目是最大而不是最小的两个
我认为解决这个问题的最简单方法是partial_sort
前两个元素(如果需要,在临时容器中)并检查它们是否与原始数据的第一个和最后一个元素匹配。