sicily 1046. Plane Spotting

/*题意:
给出一个长度为N的非负整数序列(所有数不超过200),还有两个整数M和K,求前M个最优的长度不小于K的连续子序列。
连续子序列的优先级如何比较
平均值大的序列优于平均值小的
长度大的序列优于长度小的
结束位置靠前的序列优于结束位置靠后的

*/

#include
<iostream>
#include
<stdio.h>
#include
<cmath>
#include
<algorithm>
using namespace std;
int n,m,k,arr[310];
struct node
{
double ave;
int len;
int st,ed;
bool operator<(const node& o)const
{
if(fabs(ave-o.ave)<1e-6)
{
if(len==o.len)
return ed<o.ed;
else
return len>o.len;
}
else
return ave>o.ave;
}
}table[
90000];
//对于平均数优先级比较也可以使用分数,if(s*o.len==o.s*len)... else return s*o.len>o.s*len;
//其中s是连续子序列的和

int main()
{
int cases;
cin
>>cases;
for(int id=1;id<=cases;++id)
{
cin
>>n>>m>>k;
for(int i=1;i<=n;++i)
cin
>>arr[i];
int t=0;
for(int len=k;len<=n;++len)
{
for(int i=len;i<=n;++i)
{
double s=0;
for(int j=i-len+1;j<=i;++j)
s
+=arr[j];
table[t].ave
=s/len;
table[t].len
=len;
table[t].st
=i-len+1;table[t].ed=i;
++t;
}
}
sort(table,table
+t);
printf(
"Result for run %d:\n",id);
for(int i=0;i<m&&i<t;++i)
printf(
"%d-%d\n",table[i].st,table[i].ed);
}
return 0;
}

posted on 2011-07-10 00:48  sysu_mjc  阅读(479)  评论(0编辑  收藏  举报

导航