这道题不用结构体或类的话做起来挺累的。而且做完这道题才发现我C和C++很多语法和函数都忘了。像sort(p, p+cnt)这样的排序函数都不会用了,差点就自己写冒泡排序了。而符号重写就完全忘了,毕竟很少有语言会有这种功能开放了。

   其中新写的代码用了师兄的结构体和比较符号“<”的重写。

   先贴以前写的代码:

#include <iostream>
#include <vector>
using namespace std;
class PeriodNode{
    int st;
    int end;
    double per;
public:
    PeriodNode( int s, int e, double p) {
        st = s;
        end = e;
        per = p;
    }
    int  getSt() {
        return st;
    }
    int getEnd() {
        return end;
    }
    double getPer() {
        return per;
    }
};
int main() {
    int N;
    int fst[3];
    double snd[300];
    double sum;
    double per;
    int i, j, k;
    vector<PeriodNode> period;
    vector<PeriodNode>::iterator iter;
    cin >> N;
    for( i = 0; i < N; ++i ) {
        period.clear();
        for( j = 0; j < 3; ++j)
            cin >> fst[j];
        for( j = 0; j < fst[0]; ++j )
            cin >> snd[j];
        for( j = 0; j < fst[0] - fst[2] + 1; ++j )
        {
            sum = 0;
            for( k = j; k < j + fst[2]; ++k ) {
                sum += snd[k];
            }
            per = sum / fst[2];
            --k;
            for(iter = period.begin(); iter != period.end(); ++iter)
            {
                if( per > (*iter).getPer() )
                {
                    period.insert( iter, PeriodNode(j, k, per) );
                    break;
                }
                else if ( per == (*iter).getPer() && (k-j) > ((*iter).getEnd()-(*iter).getSt()) )
                {
                    period.insert( iter, PeriodNode(j, k, per) );
                    break;
                }
                else if ( per == (*iter).getPer() && (k-j) == ((*iter).getEnd()-(*iter).getSt()) && k < (*iter).getEnd() )
                {
                    period.insert( iter, PeriodNode(j, k, per) );
                    break;
                }
            }
            if( iter == period.end() )
                period.push_back(PeriodNode(j, k, per));
            for( k = j + fst[2]; k < fst[0]; ++k ) {
                sum += snd[k];
                per = sum / (k - j + 1);
                for(iter = period.begin(); iter != period.end(); ++iter)
                {
                    if( per > (*iter).getPer() )
                    {
                        period.insert( iter, PeriodNode(j, k, per) );
                        break;
                    }
                    else if ( per == (*iter).getPer() && (k-j) > ((*iter).getEnd()-(*iter).getSt()) )
                    {
                        period.insert( iter, PeriodNode(j, k, per) );
                        break;
                    }
                    else if ( per == (*iter).getPer() && (k-j) == ((*iter).getEnd()-(*iter).getSt()) && k > (*iter).getEnd() )
                    {
                        period.insert( iter, PeriodNode(j, k, per) );
                        break;
                    }
                }
                if( iter == period.end() )
                    period.push_back(PeriodNode(j, k, per));
            }
        }
        cout << "Result for run " << i+1 << ":" << endl;
        for( j = 0;  j < fst[1] && j < period.size(); ++j ) {
            cout << period[j].getSt()+1 << '-' << period[j].getEnd()+1 << endl;
        }
    }
    return 0;
}

   再贴新写的代码:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct period {
    double aver;
    int length,ends;
};
bool operator <(const period &a,const period &b){
    if (fabs(a.aver-b.aver)>1e-6) return a.aver>b.aver;
    if (a.length!=b.length) return a.length>b.length;
    return a.ends<b.ends;
}
int main() {
    int N, nq, nb, nm;
    int i, j, k;
    int temp;
    int q[300];
    period p[90000];
    int cnt;
    cin >> N;
    for( i = 0; i < N; i++ ) {
        cin >> nq >> nb >> nm;
        for ( j = 0; j< nq; j++ ){
            cin >> q[j];
        }
        cnt = 0;
        for ( j = 0; j < nq; j++ ) {
            temp = q[j];
            for ( k = j + 1; k < nq; k++ ) {
                temp += q[k];
                if( k - j + 1 >= nm ) {
                    p[cnt].length = k - j +1;
                    p[cnt].ends = k + 1; // 记得加1,因为输出的不是数组下标,而是实际从1开始的下标
                    p[cnt].aver = (double)temp / (k-j+1);
                    cnt++;
                }
            }
        }
        sort(p, p+cnt);
        cout << "Result for run " << i +1 << ":" << endl;
        for( j = 0; j < nb && j < cnt; j++) {
            cout << p[j].ends - p[j].length + 1 << "-" << p[j].ends<< endl;     }
    }
    return 0;
}