这次有进步,终于进了前了。然后也开出了前两题,第三题那个对于现在的我而言还是有点难了,所以以后补吧。
:手速题,语法题。
:的难点在于shi山代码的实现以及做成一个圈(,然后还有就是要注意他们围成了一个圆,这里要注意的就是,我们要把圆拆成直线,然后多个数,就是前个数。然后就是推个公式就出来了,就是我们用前缀和枚举一下找到最大的区间,如果有多个最大区间,我们就枚举每个最大区间的时候这个应该标什么数。记的最小值即可。记得数组要开一倍,我就是因为没开一倍第一次了。
:
#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;
}
:
#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;
}