Codeforces Round #464 (Div. 2) C. Convenient For Everybody ----- 思维+前缀和

版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/82822474

题目传送门

题意: 

  • 注意题目中没有0:00时 以及 s,f 的区间指左闭右开区间[s,f] 即可

做法:

  • 就是找一段长度为 f-s-1的连续区间,使得这段区间的和最大,由于具有时间特性,所以要注意时间成环状的问题,所以我们在处理的时候,加倍处理即可。 比如: 1 2 3 4 1  ----->  1 2 3 4 1 1 2 3 4 1
  • 自己脑子zz,居然写成了二分,这样容易错失最小答案……

wa的有点多(゚Д゚#) 

AC代码:

#include<bits/stdc++.h>
#define IO          ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb(x)       push_back(x)
#define sz(x)       (int)(x).size()
#define sc(x)       scanf("%d",&x)
#define pr(x)       printf("%d\n",x)
#define abs(x)      ((x)<0 ? -(x) : x)
#define all(x)      x.begin(),x.end()
#define mk(x,y)     make_pair(x,y)
#define debug       printf("!!!!!!\n")
#define fin         freopen("in.txt","r",stdin)
#define fout        freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 3e5+5;
const int maxn = 2e5+10;
const int INF = 0x3f3f3f3f;
inline int read()
{
    char x;
    int u,flag = 0;
    while(x = getchar(),x<'0' || x>'9') if(x == '-') flag = 1;
    u = x-'0';
    while(x = getchar(),x>='0' && x<='9') u = (u<<3)+(u<<1)+x-'0';
    if(flag) u = -u;
    return u;
}
struct node
{
    int l,r;
    int val;
}ans[maxn];
//bool cmp(node a,node b) 用二分可能会错失smallest answer!!!
//{
//    return a.val<b.val;
//}
//vector<node> vec;
//struct cmp1
//{
//    bool operator()(const node &a,const node &b)const{
//            return a.val<b.val;
//    }
//};
int pos[maxn];
int a[maxn];
int sum[maxn];
int main()
{
    #ifdef LOCAL_FILE
    fin;
    #endif // LOCAL_FILE
    int n = read();
    int s,f;
    for(int i=1;i<=n;i++) a[i] = read();
    for(int i=n+1;i<=2*n;i++) a[i] = a[i-n]; //加倍处理
    for(int i=1;i<=2*n;i++) sum[i] = sum[i-1]+a[i];
    s = read();
    f = read();
    int len = f-s; //由于题意定义,肯定是要连续的区间
    int mx = -1;
    int k = 0;
    for(int i=1;i<=2*n;i++)
    {
        ans[i].l = i-len+1;
        ans[i].r = i;
        ans[i].val = sum[i]-sum[i-len];
        mx = max(mx,ans[i].val);
    }
    for(int i=1;i<=2*n;i++)
    {
        if(ans[i].val == mx) pos[k++] = i;
    }
//    sort(ans+1,ans+1+2*n,cmp);  用二分可能会错失smallest answer!!! 脑子ZZ了 (T▽T)
//    for(int i=1;i<=2*n;i++)
//    vec.pb(ans[i]);
//    node tmp;
//    tmp.val = mx;
//    auto it = lower_bound(vec.begin(),vec.end(),tmp,cmp1());
//        cout<<(*it).l<<" "<<(*it).r<<endl;
//     cal = (*it).l - 1;
    int cal,res;
    int fres = INF;
    for(int i=0;i<k;i++)
    {
        cal = ans[pos[i]].l-1;
        res = (s-cal+n)%n;
        while(res<0) res = (res+n)%n; //answer>0
        fres = min(res,fres);
    }
    if(fres == 0) fres = n;
    printf("%d\n",fres);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37624640/article/details/82822474