【题目描述】
众所周知,狮均国内吼叫总值(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<bits/stdc++.h>
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<<b[y]-b[x-1]<<endl;
}
return 0;
}
【问题描述】
琳琳刚学会使用数组,老师就给了他一个这样的问题: 有两个数组 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<bits/stdc++.h>
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<<a<<" ";
sun+=a;
}
return 0;
}
【问题描述】
每天中午下课铃一打,同学们为了能尽早吃上饭,不要排那么长时间的队, 都像狼一样冲向食堂,校领导看到这种情况很是担忧,因为学生们这样狂奔很危险,所以就要求必须等所有同学都来到食堂才能开始打饭,并且把排队打饭的顺序固定下来,这样谁都不用抢了。
学校里一共有 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<bits/stdc++.h>
using namespace std;
int x,n,a[101],c[101],asn=1,tim;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
c[a[i]]++;
}
sort(a,a+n);
x=n;
for(int i=0;i<n-1;i++){
x--;
tim+=x*a[i];
}
for(int i=1;i<=100;i++){
x=1;
if(c[i]!=0){
for(int j=1;j<=c[i];j++){
x*=j;
x%=2011;
}
}
asn*=x;
asn%=2011;
}
cout<<tim;
return 0;
}
【题目描述】
有 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<bits/stdc++.h>
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<sum[k+i+1]-sum[i])
max=sum[k+i+1]-sum[i];
cout<<max;
return 0;
}
【题目描述】
小 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。
【思路】
在不考虑传送器的情况下,耗费的时间是一个确定的数。在考虑传送器的情况下要使耗费时间最小,那知道找到区间长度为k的区间耗费时间最大的,然后再用不考虑传送器的情况下,减去该最大的就行。求区间和,考虑前缀和。
#include<bits/stdc++.h>
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;i++){
scanf ("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
long long ans=0;
for(int i=k;i<n;i++)ans=max(ans,sum[i]-sum[i-k]);
if(k>=n)printf("0");
else printf("%lld",sum[n-1]-ans);
return 0;
}