傳送門:http://codeforces.com/contest/939/problem/C
某星球的一天被划分成n個小時,於是這個星球的世界被划分成n個時區,標記為1~n。
一個時區的“本地時間”(Local Time)表示為1~n。相鄰兩個時區的“本地時間”間隔為1小時。當1時區的“本地時間”為1時,i時區的“本地時間”為i。
現在舉行一場在線賽事,持續時間為1小時。在i時區,將有ai人參賽。若賽事在“本地時間”s之后開始,且在“本地時間”f之前結束,則該時區的人將參賽,否則不參賽。為使得這個世界的參賽人數最多,求賽事開始的最早時間(表示為1時區的“本地時間”)。
在這個問題中,需要定義一個“標准時間”(Standard Time),之后將所有的“本地時間”折算成“標准時間”。
可以假設一個虛擬的0時區,將這個時區的時間定義為“標准時間”。於是:當0時區的“本地時間”(即“標准時間”)為0時,i時區的“本地時間”為i。
設賽事開始的“標准時間”為x,於是:若i時區參賽,則有:
①s-i≤x;
②f-i≥x+1;
於是,參賽時區區間為[s-x..f-x-1]。只需枚舉x,並將對應區間中的參賽人數求和,即可尋找參賽人數的最大值。可以考慮前綴和,或者滑動窗口(注:窗口的滑動方向應該是循環向左的)。參考程序如下:
#include <stdio.h> #define MAX_N 100005 int a[MAX_N]; int main(void) { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i % n]); int s, f; scanf("%d%d", &s, &f); int cur = 0; for (int i = s; i <= f; i++) cur += a[i % n]; int argmax = -1, max = 0; for (int i = 0; i < n; i++) { int l = (s - i + n) % n; int r = (f - i + n) % n; cur -= a[r]; cur += a[l]; if (cur > max) { max = cur; argmax = i; } } printf("%d\n", argmax + 1); return 0; }