一樣用kadane去解。
不過不太一樣的是要注意sum == max的情況,
要找最大範圍的起始點 + 終點。
/* ACM 507 Jill Rides Again
* mythnc
* 2012/01/18 11:15:29
* run time: 0.136
*/
#include <stdio.h>
#define MAXS 20001
void input(void);
void kadane(void);
void output(int);
int list[MAXS];
int n, maxstart, maxend;
int main(void)
{
int set, i;
scanf("%d", &set);
for (i = 1; i <= set; i++) {
input();
kadane();
output(i);
}
return 0;
}
/* input: receive input data */
void input(void)
{
int i;
scanf("%d", &n);
for (i = 1; i < n; i++)
scanf("%d", &list[i]);
}
/* kadane: use kadane algorithm to find the maximum sum */
void kadane(void)
{
int max, start, end;
int sum;
max = 0;
maxstart = maxend = sum = 0;
start = 1;
for (end = 1; end < n; end++) {
sum += list[end];
if (sum > max) {
max = sum;
maxstart = start;
maxend = end;
}
else if (sum == max && end - start > maxend - maxstart) {
maxstart = start;
maxend = end;
}
if (sum < 0) {
sum = 0;
start = end + 1;
}
}
}
/* output: out put result */
void output(int set)
{
if (maxstart == 0)
printf("Route %d has no nice parts\n", set);
else
printf("The nicest part of route %d is between stops %d and %d\n",
set, maxstart, maxend + 1);
}
沒有留言:
張貼留言