📄 guanggao.cpp
字号:
//1. 广告排名区间(10分)
//问题背景
//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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
long n;
long *a;
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d",&n);
a=new long[n]; //使用这种方法可以动态的确定数组的长度.
for(long i=0;i<n;i++)
{scanf("%d",&a[i]);
}
int m;
scanf("%d",&m);
long *b=new long[n];
memset(b,0,n*sizeof(long)); //将开辟的数组置为0
long count=0;
// for(long i;i<n;i++) //考虑某个值直接大于m的情况
// {
// if(a[i]>=m){printf("%d\n",0);return 0;}
// }
for(count=0;count<n;count++)
{
for(long k=0;k<n;k++)
{
if(k+count<n)
b[k]+=a[k+count];
if(b[k]>=m)
{printf("%d\n",count);return 0;}
}
}
for(long i=0;i<n;i++)
{printf("%d\n",a[i]);}
for(long i=0;i<n;i++)
{ printf("%d\n",b[i]);}
system("pause");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -