void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一些数字,要求连续几个数的平均数大于所给的数,问你最后有几种情况...

首先一个比较好的解决办法就是,把每个输入的数减去所给的数,然后问题转换为,求连续数的和大于0即可

运用循环枚举的话,O(n^2),超时是肯定的,所以可以想到此问题类似与求逆序对的问题,不过此题是正序对,稍作改动即可

直接搬上求逆序对的模版吧

#include<iostream>
#include
<cstdio>
#include
<memory.h>
#include
<stdio.h>
using namespace std;
const int MAX=100005;
int s[MAX],h[MAX];
int n,a;
long long ans;
void merge(int l,int m,int r)
{
int i=l,j=m+1,k=l;
while(i<=m&&j<=r)
{
if(s[i]<s[j])//如果改成s[i]>=s[j]即求逆序对
{
ans
+=r-j+1;
h[k
++]=s[i++];
}
else
{
h[k
++]=s[j++];
}
}
while(i<=m)
h[k
++]=s[i++];
while(j<=r)
h[k
++]=s[j++];
for(i=l;i<=r;i++)
s[i]
=h[i];
}
void mergesort(int l,int r)
{
int m=(l+r)/2;
if(l<r)
{
mergesort(l,m);
mergesort(m
+1,r);
merge(l,m,r);
}
}
int main()
{
int i,j,T;
scanf(
"%d",&T);
while(T--)
{
scanf(
"%d%d",&n,&a);
s[
0]=0;
ans
=0;
for(i=1;i<=n;i++)
{
scanf(
"%d",&j);
j
-=a;

s[i]
=s[i-1]+j;
}
mergesort(
0,n);
printf(
"%lld\n",ans);
}
return 0;
}
posted on 2011-05-06 20:36  void-man  阅读(193)  评论(0)    收藏  举报