0
#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";
}

该程序应该检查数组中的第一个和最后一个数字是否是相应数组中的最小值。正如标题所述,这是通过将数字与第一个和最后一个数字的算术平均值进行比较来完成的

问题是,它没有。无论我输入什么值,它都只显示“否”(意味着这些数字不是最低的)。经历了一百次,但无法真正弄清楚出了什么问题……任何帮助将不胜感激。

4

2 回答 2

1

您的算法存在根本缺陷,不会做您想做的事情(检查第一个和最后一个数字是否是最低的两个)。考虑这个数组:

2, 19, 19, 19, 19, 20

除了第一个元素之外的每个元素都大于平均值 ( 11),但最后一个元素是最大的,而不是最小的两个中的一个。

我认为解决这个问题的最简单的方法是partial_sort前两个元素(如果需要,在一个临时容器中)并检查它们是否匹配原始数据的第一个和最后一个元素。

于 2013-06-07T17:09:54.257 回答
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.
(first + last) / 2 = 11.5
12, 245, 654, 23, 652 都大于 11.5,所以count(v,n)返回5 (e.g. n-1),表示“最后一个数中的第一个是最小的”。


编辑:最简单的解决方案是修复count()检查if(v[i]<=m)而不是>=. 这样,它会返回小于 (first+last)/2 的数据量。如果 first==last,它将返回 2,如果 first!==last,它应该返回 1。

于 2013-06-07T17:02:33.473 回答