今年就要找工作了,实习之余开始学习一下数据结构,顺便记录一下,题目是PTA上的浙江大学数据结构题集。
第一周
res 是要求的最大子列和,cur 是当前子列和。 在序列中从头枚举每个元素: (1)当前子列和大于最大子列和,更新res = cur 。 (2)当前子列和为负数,则当前子列和加上后面的数必定不是最大的,直接舍弃掉前面的子列和,新的子列和从序列当前下标i 开始,更新cur = 0 。
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int s[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> s[i];
int res = 0, cur = 0;
for (int i = 0; i < n; i ++)
{
cur += s[i];
if (cur > res) res = cur;
else if (cur < 0) cur = 0;
}
cout << res << endl;
return 0;
}
与第1题类似,需要记录子序列长度,进而求出子序列首尾元素。
#include <iostream>
using namespace std;
const int N = 10010;
int n;
int s[N];
int main()
{
cin >> n;
bool all_neg = true;
for (int i = 0; i < n; i ++)
{
cin >> s[i];
if (s[i] >= 0) all_neg = false;
}
if (all_neg)
{
cout << 0 << " " << s[0] << " " << s[n - 1] << endl;
return 0;
}
int res = 0, cur = 0, first = s[0], last = s[n - 1], len = 0;
for (int i = 0; i < n; i ++)
{
cur += s[i];
len ++;
if (cur > res || (res == 0 && cur == 0))
{
res = cur;
first = s[i - len + 1];
last = s[i];
}
else if (cur < 0)
{
cur = 0;
len = 0;
}
}
cout << res << " " << first << " " << last << endl;
return 0;
}
整数二分的裸题。
Position BinarySearch( List L, ElementType X )
{
Position l = 0, r = L->Last;
while (l < r)
{
Position mid = (l + r) / 2;
if (L->Data[mid] >= X) r = mid;
else l = mid + 1;
}
return L->Data[l] == X ? l : NotFound;
}
|