1. 程式人生 > >Codeforces Round #464 (Div. 2) C. Convenient For Everybody ----- 思維+字首和

Codeforces Round #464 (Div. 2) C. Convenient For Everybody ----- 思維+字首和

題目傳送門

題意: 

  • 注意題目中沒有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;
}