前缀和的应用(c++)

第1题     习题1 狮子吼叫 查看测评数据信息

【题目描述】

众所周知,狮均国内吼叫总值(RealGDS perlion)是衡量一个狮子国狮子 健康程度的重要指标。其计算方法为,选取若干只狮子,将每个狮子吼叫的次数 相加的总值。 叶子是狮子国健康委员会的会长,有人举报小林汇报的狮均国内吼叫总值的 数据有误,所以他想请你帮忙计算。 具体来说,你会知道编号为 1 到 n 的 n 只狮子吼叫的次数 。叶子会提出 q 个问题。对于每个问题它会给出 l 和 r。它想知道编号在 l 和 r 之间的狮子的狮均国内吼叫总值。

【输入格式】

第一行两个整数 n和q,分别代表狮子的数量和叶子的问题数。n,q≤10^5。

第二行 n 个整数 ,代表编号为 i 的狮子的吼叫次数。 第 3+q 行,每行两个整数 l, r( 1 ≤ l ≤r ≤ n)

【输出格式】

q 行整数,代表计算出来的狮均国内吼叫总值。

【输入样例】

6 3

4 6 1 3 5 2

1 3

2 5

3 4

【输出样例】

11

15

4

#include
using namespace std;
long long n,m,a[9999999],b[9999999],x,y;
int main(){   
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i]=b[i-1]+a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        cout<
第2题     习题2 数列 查看测评数据信息

【问题描述】

琳琳刚学会使用数组,老师就给了他一个这样的问题: 有两个数组 A[1..n]和 B[1..n]他们之间存 在数学关系式是:  B[i] = ( A[1] + A[2]+...A[i])/i (注意是整除) ,其中 1 <= i <= n。

例如:  A 数组是:  1,  3,  2,  6,  8。

那么 B 数组是:

1/1,(1+3)/2,(1+3+2)/3,(1+3+2+6)/4,(1+3+2+6+8)/5

可以算出 B 数组是:  1,2,2,3,4

【输入格式】

输入数据有两行:

第一行,一个整数 n。  1 <= n <= 100。

第二行,包含 n 个整数,第 i 个整数是 B[i]。  1 <= B[i] <= 10^9。

【输出格式】

输出数据仅一行,共 n 个整数, 每个数之间用一个空格分开, 第 i 个整数表示 A[i]。 数据保证 A[i]一定是整数,而且保证 1<=A[i]<=10^9。

【输入样例】

4

3 2 3 5

【输出样例】

3 1 5 11

#include
using namespace std;
long long n,b,a,sun=0;
int main(){    
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>b;
        a=b*i-sun;
        cout<
第3题     习题3 排队打饭  查看测评数据信息

【问题描述】

每天中午下课铃一打,同学们为了能尽早吃上饭,不要排那么长时间的队, 都像狼一样冲向食堂,校领导看到这种情况很是担忧,因为学生们这样狂奔很危险,所以就要求必须等所有同学都来到食堂才能开始打饭,并且把排队打饭的顺序固定下来,这样谁都不用抢了。

学校里一共有 N(1<=N<=100)个学生,每个学生打饭所需时间也是已知的,为了不让学生排队等得心烦,要求设计一个排队顺序使得所有学生的等待时间之和最小,等待时间为从开始排队到开始打饭所需的时间,所以第一个学生的等待时间为 0。

为了给同学们新鲜感,领导想在保证等待时间之和最小,你能帮忙吗?

【输入格式】

第一行输入一个整数 N(1<=N<=100),表示学生人数。

第二行输入 N 个正整数(在 1 到 100 之间),中间用空格隔开,表示每个学生打饭所需要的时间。

【输出格式】

一行输出1个整数,表示最小的等待时间之和

【输入样例】

4

1 2 1 2

【输出样例】

 7

样例解释:

   有 4 种排队方案分别是 1 3 2 4、3 1 2 4、1 3 4 2、3 1 4 2,等待时间都是7。 

#include
using namespace std;
int x,n,a[101],c[101],asn=1,tim;
int main(){
	cin>>n;
	for(int i=0;i>a[i];
		c[a[i]]++;
	}
	sort(a,a+n);
	x=n;
	for(int i=0;i
第4题     习题4水杯 查看测评数据信息

【题目描述】

有 n 个容量无穷大的水杯,它们从 1~ n 编号,初始时 i 号水杯中装有 A_i 单位的水。

你可以进行不超过 k 次操作,每次操作需要选择一个满足 1≤ x≤ n-1 的编号 x,然后把 x 号水杯中的水全部倒入 x+1 号水杯中。

最后你可以任意选择恰好一个水杯,并喝掉水杯中所有的水。现在请你求出,你最多能喝到多少单位的水。

【输入格式】 

第一行一个正整数 n,表示水杯的个数。

第二行一个非负整数 k,表示操作次数上限。

第三行 n 个非负整数,相邻两个数用空格隔开,表示水杯的初始装水量 A_1, A_2, …, A_n。

【输出格式】 

一行,仅一个非负整数,表示答案。

【样例输入】 

10

5

890 965 256 419 296 987 45 676 976 742

【样例输出】 

3813

【数据规模与约定】 

- 对于 10% 的数据,保证 n ≤10。

- 对于 30% 的数据,保证 n ≤100。

- 对于 50% 的数据,保证 n ≤10^3。

- 对于 70% 的数据,保证 n ≤10^5。

- 对于 100% 的数据,保证 1≤n≤10^6,0≤ k ≤n-1,0≤ A_i≤ 10^3。

输入/输出例子1

输入:

6

2

4 5 1 3 6 2

输出:

11

#include
using namespace std;
int A[1000010],sum[1000010];
int main(){
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>A[i];
		sum[i]=sum[i-1]+A[i];
	}
	int max=sum[k+1];
	for(int i=1;i<=n-k-1;i++)
		if(max
第5题     习题5 光骓者的荣耀 查看测评数据信息

【题目描述】

小 K 又在做白日梦了。他进入到他的幻想中,发现他打下了一片江山。

小 K 打下的江山一共有 n个城市,城市 i和城市 i+1有一条双向高速公路连接,走这条路要耗费时间 ai。

小 K 为了关心人民生活,决定定期进行走访。他每一次会从 1号城市到 n号城市并在经过的城市进行访问。其中终点必须为城市n。不仅如此,他还有一个传送器,传送半径为 k,也就是可以传送到 i-k和 i+k。如果目标城市编号小于 1则为 1,大于 n则为 n。但是他的传送器电量不足,只能传送一次,况且由于一些原因,他想尽量快的完成访问,于是就想问交通部部长您最快的时间是多少。

注意:他可以不访问所有的城市,使用传送器不耗费时间。

【输入格式】

两行,第一行 n,k。

第二行 n-1个整数,第 i个表示ai。

【输出格式】

一个整数,表示答案。

【输入样例1】

4 0

1 2 3

【输出样例1】

6

【输入样例2】

4 1

1 2 3

【输出样例2】

3

【样例解释】样例1不用传送器直接走,答案为6,样例2在3处使用,传送到4,答案为3。

【数据范围】对于所有数据ai>0。

前缀和的应用(c++)_第1张图片

 

【思路】

在不考虑传送器的情况下,耗费的时间是一个确定的数。在考虑传送器的情况下要使耗费时间最小,那知道找到区间长度为k的区间耗费时间最大的,然后再用不考虑传送器的情况下,减去该最大的就行。求区间和,考虑前缀和。

#include
using namespace std;
long long n,k;
long long sum[1000999],a[1000999];
int main(){	
	scanf("%d%d",&n,&k);
	for(int i=1;i=n)printf("0");	
	else printf("%lld",sum[n-1]-ans);	
	return 0;
} 

你可能感兴趣的:(c++,算法,数据结构)