小埋再遇a+b+c问题

题面

image

代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100005], l[100005], r[100005];
int main(){
	ll t;
	cin>>t;
	while(t--){
		ll n,ans = 0;
		cin>>n;
		memset(l,0,sizeof(l));
		memset(r,0,sizeof(r));
		for(ll i=1;i<=n;i++) cin>>a[i];
		for(ll i=1;i<=n;i++) l[i]=max(l[i-1],a[i]+i);
		l[0]=0;
		a[n+1]=0;
		ans=0;
		for(ll i=n;i>=1;i--) r[i] = max(r[i+1],a[i]-i);
		for(ll i=2;i<n;i++) ans=max(a[i]+l[i-1]+r[i+1],ans);
		cout <<ans<<endl;
	}
	return 0;
}

分数

WA90

错误阳历

话说为什么是第一个阳历错

输入
7
100
254156 354614 741521 283317 430612 671169 12863 4177 774626 755225 582076 960089 296545 494721 653067 482573 388650 624521 298081 19357 25426 34993 957193 660868 422586 47555 801269 385428 503709 157818 613607 288401 46096 916314 614121 899640 11800 135245 887282 109401 535457 364701 682621 122161 161279 616525 863049 190735 577991 493825 297361 568259 844744 833379 272755 135053 559409 249926 877169 119786 664036 540466 545163 800574 14698 864711 145271 598357 399721 782281 724876 151925 462429 208919 993777 141457 381541 46262 430086 682817 618953 12301 923821 922329 7145 268493 666951 903517 252361 407481 687361 685545 219859 515911 371761 661193 109153 434975 872287 587351 
100
190045 222035 412589 54932 453601 729856 669997 800337 123509 186289 750996 773777 124695 469265 498881 778801 617419 721849 485002 133377 277852 425197 37186 228257 229549 937541 582081 919393 850373 87161 44905 410337 256806 230262 725576 107776 404761 708708 680877 526706 416881 675819 544201 343489 511009 8029 221409 795478 388549 18146 150757 657671 568001 427280 67451 553500 241976 552116 73184 453283 115400 610001 528537 797141 146481 503157 549001 842441 820838 954699 490097 708871 113311 128804 9625 827921 872721 644833 615 115886 981281 828249 799881 583993 614689 339300 507392 64069 74234 112179 736025 429424 554587 964815 968184 562356 876079 667168 888531 443922 
100
206913 170241 39141 548447 842209 537981 436545 721949 246103 491291 512938 837021 457460 930001 83537 521571 702901 30449 877521 412117 870228 395638 601189 747067 702137 69937 194593 588304 470191 164631 25111 84688 636460 885733 553253 5497 567617 177789 959413 797210 53848 458425 601026 82721 206873 458038 819596 907991 503599 835174 642001 758036 973249 124428 662977 512871 908133 825937 387163 721741 790001 173533 805368 96823 161489 169331 219097 749201 622617 630676 677164 365703 992289 376935 871876 123693 154594 59272 317409 279339 430851 157549 22277 861868 288637 29033 946061 525285 864393 231677 531005 405694 616001 761535 675055 212751 790087 274929 267465 653261 
5
5 1 4 2 3
4
1 1 1 1
6
9 8 7 6 5 4
7
100000000 1 100000000 1 100000000 1 100000000
输出

2910996
2914266
2924917
8
1
22

还有个CE的
#include <bits/stdc++.h>
#define ll long long
using namespace std;
long long a[100005], l[100005], r[100005];
int main(){
	int t;
	cin >> t;
	while(t--){
		int n,ans=0;
		cin>>n;
		memset(l,-1,sizeof(l));
		memset(r,-1,sizeof(r));
		for(int i=1;i<=n;i++) cin >> a[i];
		for(int i=1;i<=n;i++) l[i]=max(l[i-1], a[i]+i);
		l[0]=0;
		a[n+1]=0;
		ans=0;
		for(int i=n;i>=1;i--) r[i]=max(r[i+1],a[i]-i);
		for(int i=2;i<n;i++) ans=max(a[i]+l[i-1]+r[i+1],ans);
		cout<<ans<<endl;
	}
	return 0;
}

话说他给的样例没过,我是咋90分的

初始化用手写for循环
一到n,赋值为1e9

为啥

因为取max时有负数

可以用memset吧

稍等,我组织下语言,我A过这题

你们可以康康CE代码

哇塞塞,yht%%%

a???

你们可以康康CE代码

a[n+1]=-1e9;

观察题意,要求我们最大化一下 a + b + c - (r - l)。观察到 r - l 是区间的长度减1(因为区间包含 lr ),所以可以重新组织表达式:a + b + c - (r - l) = a + b + c - (r - l + 1) + 1 = (a + b + c) - 区间长度 + 1

因为我们要最大化这个东西 (a + b + c) - 区间长度 + 1,明显发现,区间长度尽量小,这个 a+b+c 就会越大。所以我们只需要遍历区间长度为 3 的所有的区间即可(因为刚好是 a、b、c 三个数)。

你们可以康康CE代码

你们可以康康CE代码

1 个赞

我回复你了,你看下

1 个赞

yht。%%%

bushi,你们看看CE代码啊

你按照我的思路写就行

能看看CE代码吗,求你了

好的。。。