题目大意:jill 骑行时每段路有一个好感值,可以先搭公交在任意站点下车再开始骑行,直到到达任意目的地,问骑哪段路得到的好感值最大。
解题思路:直觉就是暴力,O(n
2
)超时了,查题解,学习了最大子序列和问题 by 在hust快乐的学习,一步一步分析优化写的非常好。
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
const int INF = 0x3f3f3f3f;
const int NINF = -INF -1;
using namespace std;
int val[20010];
int r, T, cnt = 1;
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &r);
for (int i = 1; i < r; i++)
scanf("%d", &val[i]);
int maxn = NINF, sum = 0;
int lef = 1, rig = 1, bg = 1;
for (int i = 1; i < r; i++) {
if (sum < 0) {
sum = 0;
bg = i;
}
sum += val[i];
if (sum > maxn || (sum == maxn && i-bg >= rig-lef)) {
maxn = sum;
lef = bg;
rig = i+1;
}
// printf("%d %d %d %d\n", sum, bg, lef, rig);
}
if (maxn < 0) printf("Route %d has no nice parts\n", cnt++);
else printf("The nicest part of route %d is between stops %d and %d\n", cnt++, lef, rig);
}
return 0;
}