Acwing 131次周赛(补C)

64 阅读2分钟

竞赛 - AcWing

这次有进步,终于进了前1010%了。然后也开出了前两题,第三题那个dpdp对于现在的我而言还是有点难了,所以以后补吧。

AA:手速题,语法题。

BB:BB的难点在于shi山代码的实现以及做成一个圈(,然后还有就是要注意他们围成了一个圆,这里要注意的就是,我们要把圆拆成直线,然后多rl1+r-l-1个数,就是前rl1r-l-1个数。然后就是推个公式就出来了,就是我们用前缀和枚举一下找到最大的区间,如果有多个最大区间,我们就枚举每个最大区间的时候这个11应该标什么数。记idid的最小值即可。记得数组要开一倍,我就是因为没开一倍第一次MLEMLE了。

AA:

#include <bits/stdc++.h>

#define x first
#define y second

#define ll long long
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);

using namespace std;
int t;
void solve(){
	
	int a[4];
	cin>>a[1]>>a[2]>>a[3];
	sort(a+1,a+4);
	cout<<a[2];
}
int main(){
	IOS;
	t=1;
	while(t--) solve();
	return 0; 
} 

BB:

#include <bits/stdc++.h>

#define x first
#define y second

#define ll long long
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);

using namespace std;
int t,n;
const int N=200010;
int a[N];
ll s[N];
int l,r;
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>l>>r;//[l,r-1];
	for(int i=n+1;i<=n+r-l-1;i++){
		a[i]=a[i-n];
	}
//	for(int i=1;i<=n+r-l+1;i++){
//		cout<<a[i]<<" ";
//	}
	int len=n+r-l-1;
	for(int i=1;i<=len;i++){
		s[i]=s[i-1]+a[i];
	}
	ll maxn=0;
	for(int i=r-l;i<=len;i++){
		maxn=max(maxn,s[i]-s[i-r+l]);
	}
	//cout<<maxn<<endl;
	int id=0x3f3f3f3f;
	for(int i=r-l;i<=len;i++){
		if(s[i]-s[i-(r-l)]==maxn){
		//	cout<<i<<endl;
			if(i-(r-l)+1<=l) id=min(id,r-i);
			else id=min(id,n-i+r);
		}
	}
	
	cout<<id;
}
int main(){
	IOS;
	t=1;
	while(t--) solve();
	return 0; 
}