您的位置:首页 > 其它

sicily 1046. Plane Spotting

2011-07-10 00:48 253 查看
/*题意:
给出一个长度为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: