题意
给出一个长度为N的非负整数序列(所有数不超过200),还有两个整数M和K,求前M个最优的长度不小于K的连续子序列。
连续子序列的优先级如何比较
平均值大的序列优于平均值小的
长度大的序列优于长度小的
结束位置靠前的序列优于结束位置靠后的
#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef struct Data//结构体表示选出的子序列
{
int start;//子序列的起始位置
int end;//子序列的结束为止
int sum;//子序列的和
double average;//子序列的平均值
}Data;
bool cmp(Data a,Data b)
{
int lengthOfa = a.end - a.start;
int lengthOfb = b.end - b.start;
if(a.average != b.average)
return a.average > b.average;//平均值大的序列优于平均值小的
else if(lengthOfa != lengthOfb)
return lengthOfa > lengthOfb;//长度大的序列优于长度小的
else if(a.end != b.end)
return a.end < b.end;//结束位置靠前的序列优于结束位置靠后的
return false;
}
int main()
{
int time;
int lis[1000];
int count = 0;
vector<Data> result;
result.clear();
//scanf("%d",&time);
cin >> time;
while(time--)
{
int length,m,k;
count++;
//scanf("%d,%d,%d",&length,&m,&k);
cin >> length >> m >> k;
for(int i = 1;i <= length;i++)
{
//scanf("%d",&lis[i]);
cin >> lis[i];
}
for(int i = k;i <= length;i++)//i的起始值为k,即子序列的最短长度为k
for(int j = 1;i + j - 1 <= length;j++)//选出所有长度为i的子序列
{
Data data;
data.start = j;
data.end = i + j - 1;
data.sum = 0;
for(int p = j;p <= i + j - 1;p++)//求此段子序列的和
data.sum = data.sum + lis[p];
data.average = 1.0*data.sum / i;
result.push_back(data);
}
sort(result.begin(),result.end(),cmp);
cout << "Result for run " << count << ":" << endl;
for(int i = 0;i < result.size() && i < m;i++)
cout << result[i].start << "-" << result[i].end << endl;
result.clear();
}
return 0;
}