终于想起我的csdn密码系列。。大概算一算也有接近两个月没更了,一部分因为懒,一部分因为大三期末还是挺重要的,复习+考试前后一个多月,现在写这篇blog的时候已经在家呆了接近两周了,交完三月份的pat甲级考试的报名费接近二百大洋(真的很贵啊,有木有!)原本只要200,现在居然涨价了,用了牛客网的优惠券居然还要200,嘛,这钱就当给自己刷题找个动力喽。
扯远了,言归正传。这题还是比较简单的,照例,我先大概解释一下题目。简单的说就是要求给定序列子序列的最大和,输出该最大和以及该子序列的首元素和尾元素,若存在多个相同结果的子序列,则输出索引最小的那个子序列。若该序列全部为复数,则认为该序列最大的子序列的和为0,同时首元素和尾元素认为是该给定序列的首元素和尾元素。
我的思路就是暴力搜索,当然需要去掉一些明显不是的解,比如首元素为负数是不可能得到最大和的,所以这种解直接过滤,所以虽然使用的是暴力搜索,但是总的效率还不错,下面上代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{int K;cin >> K;vector<int> arr(K);for (int i = 0; i < K; i++) //输入n0-nk{cin >> arr[i];}int Max = -99999;int leftIndex = 0;int rightIndex = 0;for (int i = 0; i < K; i++){if (arr[i] < 0){continue;}else{int tempSum = 0;for (int j = i; j < K; j++){tempSum += arr[j];if (Max < tempSum){Max = tempSum;leftIndex = i;rightIndex = j;}}}}if (Max <0) //元素全为0的情况{cout << 0 << " " << arr[0] << " " << arr[K - 1];}else{cout << Max << " " << arr[leftIndex] << " " << arr[rightIndex];}system("pause");return 0;
}