【usaco2013 mar】懒惰的奶牛

版权声明:觉得写得可以就随意转载。随意注明出处。 https://blog.csdn.net/qq_41734244/article/details/79915711

时间限制: 1000 ms 空间限制: 128000 KB

题目描述

夏天又到了,奶牛贝里斯开始变得非常懒惰。他想要站在一个地方,然后只走很少的一段路,就能吃到尽可能多的美味的青草。
有N块草坪排列在一条直线上,第i个草坪拥有g_i数量的青草,第i个草坪所在的位置是x_i。奶牛贝里斯想要在直线上选择一个点作为他的初始点(初始点有可能和草坪的位置重合),这样他就能吃到以这个点为中点距离不超过K的位置上的所有青草。
 如果初始点可以自由选择的话,请帮助贝里斯计算他最多能吃到的青草的数量。

输入

  第一行是两个正整数,表示N和K。
  第2行到第N+1行,每行两个整数,第i行的两个整数表示第i个草坪的g_i和x_i。

输出

 输出贝里斯最多能吃到的青草数量。

样例输入

4 3

4 7

10 15

2 2

5 1

样例输出

11

数据范围限制

【样例说明】

如果贝里斯将初始点选择在x=4的位置,那么他可以吃到x=1,x=2和x=7这三个地方的青草,总共是11。

【数据规模】

1<=N<=100000,1<=g_i<=10000,0<=x_i<=1000000,1<=k<=2000000。

-------------------------------------------------------------------------------------------------------------------------------------------------------

因为是直线,所以可以想到用数轴来做

(自己画的,丑的一批,能看就行)。

我们用数组a表示这个数轴,a[1]表示5,a[2]就表示2,a[7]就表示4,a[15]表示10,其他就是0。因为数据有点大,我们可以考虑优化。

我就用的是前缀和来做这道题。然后注意一下细节。

我这个代码很慢,没有太多的优化。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
long long sum[2000005];
long long a[2000005];
int main(){
	long long n,k;
	cin>>n>>k;
	long long maxx=-1;
	long long max_s=-1;
	while(n--){
		long long number,s;
		cin>>number>>s;
		a[s]=number;//用数轴来存储
		maxx=max(maxx,s);//找到最大的距离
	}
	if(k>maxx){//如果k比最大的距离要大的话,就直接将数轴上所有的草加起来(md,WA了几次才注意到)
		long long tot=0;
		for(int i=0;i<=maxx;i++)//从0开始。
		tot+=a[i];
		cout<<tot;
		return 0;
	}
	for(int i=1;i<=2000005;i++){//前缀和。
		sum[i]=sum[i-1]+a[i];
	}
	long long tot=-1;
	for(long long i=2000005;i>=2*k+1;i--){//从后向前来找
		tot=max(tot,sum[i]-sum[i-(2*k+1)]);
	}
	cout<<tot;
}

展开阅读全文

没有更多推荐了,返回首页