题意:若干年以后地球会变成n个时区, 为了方便计时, 每个时区的时间从1:00开始到n:00点结束, 现在将要举行一场c赛, 每个时区内都有ai个人参加,并且比赛开始时间不早于当地时间s:00, 比赛结束时间不晚于(或等于)f:00才会参加,现在求比赛的开始时间(第一时区的当地时间),使得参加人数最多,如果有多个答案,输出时间最小的那个。
题解:我们可以看作当地时间在[s:00,f-1:00]时间内的人会参加比赛,然后每次增加一个小时就删除最右边那个区间的人数,加上最左边区间的人数,再进行比较就好了。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define fi first 5 #define se second 6 #define lson l,m,rt<<1 7 #define rson m+1,r,rt<<1|1 8 #define max3(a,b,c) max(a,max(b,c)) 9 const int INF = 0x3f3f3f3f; 10 typedef pair<int,int> pll; 11 const int N = 1e5+5; 12 ll s, f; 13 ll a[N]; 14 int n; 15 ll ans , id = 1; 16 int main() 17 { 18 ios::sync_with_stdio(false); 19 cin.tie(0); 20 cout.tie(0); 21 cin >> n; 22 for(int i = 1; i <= n; i++) 23 cin >> a[i]; 24 cin >> s >> f; 25 f--; 26 int l = s, r = f; 27 ll num = 0; 28 for(int i = s; i <= f; i++) 29 num += a[i]; 30 ans = num; 31 for(int i = 2; i <= n; i++) 32 { 33 num -= a[r]; 34 r--; 35 l--; 36 if(l == 0) l = n; 37 if(r == 0) r = n; 38 num += a[l]; 39 if(num > ans) 40 { 41 ans = num; 42 id = i; 43 } 44 } 45 cout << id << endl; 46 return 0; 47 }