问题背景
shifen广告消费预估系统可以估计出一段时间内一个特定的广告在检索结果中排在各个位置的几率。比如系统对某广告的输出如下:
p1=0.03,p2=0.08,p3=0.04……
这说明该广告展现在第1位的概率是3%,展现在第2位的概率是8%,展现在第3位的概率是4%……
问题是:如何给出一个排名估计区间[i,j],使得广告出现在该区间中的概率大于或等于一个预设值p,同时这个区间所包含的元素尽可能的少。也可用数学语 言来描述:给定数p和数列p1,p2,…,pn,求i和j(1<=i<=j<=n),在满足pi+pi+1+…+pj>=p的前 提下让j-i最小。
一般来说,pi只需保留6位小数就足够了。这样,若令ai=106pi,a=106p,则a和所有的ai均为[0,106]之间的整数。这样就避免了对实数的处理。
输入格式
第一行包含一个整数n(1<=n<=100,000)。
以下n行每行包含一个[0,106]内的整数,依次为a1,a2,…,an。这n个整数之和保证不超过106。
最后一行包含一个[0,106]内的整数a。保证所有ai之和不小于a。
输出格式
输出仅一行,包含一个整数,即j–i的最小值。
样例输入
7
5
8
4
7
10
5
2
18
样例输出
2
样例解释
a2=8,a3=4,a4=7之和为19,满足条件。而任何两个相邻数之和均小于18。
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int>v;
int linecount = 0;
int length = 0,count = 0,tmp,sum = 0;
bool isfound = false;
cin>>count;
//读入区间数据
for (int i = 0; i<count; i++)
{
cin>>tmp;
v.push_back(tmp);
}
cin>>sum;
vector<int> vsum(count, 0);
while(length < count)
{
for (int j = 0; j + length< v.size();j++)
{
vsum[j] += v[j+k];
if (vsum[j] >= sum)//若条件满足,则输出当前区间长度并终止循环
{
isfound = true;
cout<<"result is: "<<length<<endl;
return 1;
}
}
length++;
}
return 0;
}