一、链接
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
二、题目
题目描述
犇犇是一只贪玩的牛。他最喜欢的游戏是夹娃娃。已知有 n 个娃娃排成一排,犇犇可以控制夹子的位置和夹子的宽度。每个娃娃的价值为整数 w[i],犇犇想知道,他夹起的l 到r 个娃娃的总价值是多少
输入描述:
第 1 行两个正整数 n,k。n 表示娃娃的个数,k 表示询问的次数
第 2 行 n 个正整数,表示数组 w,第 i 个数字表示 w[i]
接下来的 k 行,每行两个正整数 l,r。表示犇犇抓起来的娃娃的范围。
数据范围:
对于20%的数据,保证l=r
对于30%的数据,保证n<=100
对于20%的数据,保证k<=100
对于所有数据:
1<=n<=1e5, 1<=k<=1e6
1<=w[i]<=1e3
1<=l<=r<=n
输出描述:
输出 k 行,每行一个数,表示从 l 到 r 的价值和。
示例1
输入
5 2 2 4 1 3 6 1 3 2 4
输出
7 8
示例2
输入
3 3 2 6 4 1 3 2 3 1 2
输出
12 10 8
备注:
包括第l个和第r个
三、注意&思路
cin与scanf区别
竞赛中应该用scanf还是cin? scanf&printf与cin&cout的比较+快读快写
本人本道题也遇到了这个问题,所以了解了一下二者区别。快读快写没看懂。
cin由于不需要输入数据类型,所以会先搜索数据类型,而scanf由于已经指定,所以时间更短。
数组的应用
见二者代码区别,此时数组的使用省略了一层循环,提高了效率。
四、代码
AC(代码)用来数组,所以省了一次循环
#include<iostream>
using namespace std;
int main()
{
long long n=0,k=0;
long long l=0,r=0;
int w[100005]={0};
int sum[100005]={0};
cin>>n>>k;
// cout<<n<<k;22
for(int i=1;i<=n;i++)
{
cin>>w[i];
sum[i]=sum[i-1]+w[i];
}
// printf("sadasd\n");
for(int i=0;i<k;i++)
{
scanf("%d %d",&l,&r);
// for(int x=l;x<r;x++)
// {
// sum+=w[x];
// }
// cout<<sum[r]-sum[l-1]<<endl;
printf("%d\n",sum[r]-sum[l-1]);
}
return 0;
}
运行超时代码,用的循环,只过了70%
#include<iostream>
using namespace std;
int main()
{
long long n=0,k=0;
long long l=0,r=0;
long long sum=0;
cin>>n>>k;
// cout<<n<<k;22
int w[100005]={0};
for(int i=0;i<n;i++)
{
cin>>w[i];
}
// printf("sadasd\n");
for(int i=0;i<k;i++)
{
sum=0;
cin>>l>>r;
for(int x=l-1;x<r;x++)
{
sum+=w[x];
}
cout<<sum<<endl;
}
return 0;
}