大の摆の特の摆(青岛理工大学2021新生赛)

该博客讨论了一种算法问题,其中出题人需要在n个连续时刻中选择连续摆烂m个时刻,目标是使浪费的精力最少。通过分析输入数据范围和问题特性,博主提出利用前缀和优化暴力解法,将时间复杂度降低到O(n),并给出了C++代码实现。博客中包含了示例解释和解决方案的详细步骤。
摘要由CSDN通过智能技术生成

描述

出题人想不到这题出什么好了,所以出题人摆烂了。

现给出出题人在n个连续时刻的精力,出题人决定连续摆烂m个时刻,求出题人在哪个时刻开始摆烂可以使他浪费的精力最少,并输出浪费的最少精力。

输入

第一行两个整数n,m。表示现在有n个时刻,出题人连续摆烂m个时刻(0<n<=1000000,0<m<=n)。

第二行n个整数ai,表示出题人在第i个时刻的精力。(0<=ai<=100)

输出

输出两个整数,摆烂的最佳时刻以及摆烂浪费的最少精力。中间用空格隔开,如果有多个最佳时刻请输出最小的那一个,因为出题人想尽快开摆。

输入  

5 3
1 2 3 4 5

输出

1 6

提示

样例解释:从时刻1开始摆烂,摆烂1、2、3共3个时刻,浪费的总精力为a[1]+a[2]+a[3]=6。

有点像最大连续子序列的问题,但是这题并不是,首先是最少,其次已经给定了序列长度,所以也就意味着这题将会比最大连续子序列简单,介于本题的数据范围,常规暴力肯定是不行,所以这就需要前缀和来进行优化,这就会使时间复杂度降为O(n)

//#include <stdio.h>
#include <bits/stdc++.h>
//#define ll long long
#define ull unsigned long long
const int N=5000100;
const double pi=acos(-1.0);
using namespace std;
int a[N],n,m,aa=N,pp=-1;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]+=a[i-1];
	}
	for(int i=m;i<=n;i++){
		if(a[i]-a[i-m]<aa){
			aa=a[i]-a[i-m];
			pp=i-m+1;
		}
	}
	cout<<pp<<" "<<aa;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值