A. The Enchanted Forest #769 div1

Problem - A - Codeforces

题意:

给你一串序列,任意从什么地方开始,给你k秒时间,让你算最大价值

每一秒时间按顺序你可以做:

①移动到|x-y|<=1的地方

②取走这个位置上所有的数

③每个位置+1

原来是0秒,从第一秒开始计时

感悟:

这一题我的思维有点混乱,不是特别明朗,但是该考虑的点我都考虑了一遍,可能在想其他的时候,原来想的忘记了...比如我刚想到分情况,又跳到了另一个点上,最后忘记了分情况,以后记得把重点写下来。分析的时候思路也不是特别明朗,奇怪的思路这里就先不说了,分析一下正解

分析:

首先这样子的应该先想到分情况去讨论,k<=n和k>n的情况,因为两种走的方式完全不一样

第一种k<=n貌似更好考虑一些:

假设没有增加的量,那走法并不会出现原地跳或者来回跳,可以想到的是连续的k个地方去取,然后我们可以看看加上增加量,取连续k个位置是不是正解

因为如果没有增加量,每个区间都是定值。这里可以单独考虑一下增加值:增加量与时间成正比,以位置作为观察量可知,走到某个位置的时间t[i]是固定的,所以不管是不是来回走每个位置所取走的量都是最后一次走到那个位置t[i]-1

所以看看是否正解:总的价值即\sum (t[i]-1)------->为x个数连加,如果存在来回跳的话,每一个位置取最后走到的t[i]-1,这些和相加,最大的秒数只有k秒,来回跳,经过的越少,所以起步越大,例如:3+4+...+7,如果不会来回跳就是0+1+2+3+4+...+7,贪心策略就可以看出来了。所以在这种情况,不可能存在来回跳的情况,后面的时间是定值,最大价值即一段连续k个值的和最大,这个好说,直接遍历一遍就好

第二种情况k>n:

那这个肯定有来回跳的情况了,这个我们依然需要把全部的数加上,最大的增加值即为k-1+k-2+k-3+...+k-n+1,因为相加的个数都是n,当然越大越好,起步越大越好。

具体见代码:

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define IOS ios::sync_with_stdio(false), cin.tie(0);
#include<iostream>
#include<map>
#include<set> 
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<queue>
#include<deque>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PAII;
const int N=2e6+10,M=5050,INF=1e18,mod=1e9+7;
int a[N],s[N];
signed main(){
    IOS;
    int T;
    //T=1;
    cin>>T;
    while(T--)
    {
    	int n,k;
    	cin>>n>>k;
    	for(int i=1;i<=n;i++)
    	{
			cin>>a[i];
			s[i]=s[i-1]+a[i];
		}
		if(k<=n)
		{
			int maxn=-1;
			for(int i=1;i+k-1<=n;i++)
			{
				int l=i,r=i+k-1;
				int x=s[r]-s[l-1];
				maxn=max(maxn,x);
			}
			for(int i=1;i<=k;i++) maxn+=i-1;
			cout<<maxn<<"\n";
		}
		else
		{
			int res=s[n];
			for(int i=1;i<=n;i++) res+=k-i;
			cout<<res<<"\n"; 
		}
	}
    return 0;
} 
/*


*/ 

根据引用\[1\]和引用\[2\]的信息,你可以通过以下两种方式来下载droidbot: 1. 通过链接下载:你可以访问https://androidsdkmanager.azurewebsites.net/Buildtools ,在该链接上下载不同系统平台(Windows、Linux、MacOS)和不同版本的安卓编译工具包。这个链接提供了最低版本支持到Android 4.4。 2. 通过官网下载:你可以访问Android官网,直接下载Android SDK Platform Tools。这个组件包含了与Android平台进行交互的工具,例如adb、fastboot和systrace。你可以在官网上找到这个组件并进行下载。 希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *2* [Android的build-tools的下载方式](https://blog.csdn.net/FussyCat/article/details/118819712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android SDK Platform Tools下载(包括adb 、 fastboot 和 systrace)](https://blog.csdn.net/Enchanted1017/article/details/121096516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值