NYOJ 422 字串和之差

2021-06-18 03:50:25 字數 1308 閱讀 4875

題目雖然是中文的,但說的不是很清楚,求的是連續子串行和的絕對值的最大值和最小值,然後求兩個絕對值的差。

剛開始還以為是最大連續子串行和的問題,發現不一樣,想了一會樣例,然後看了discuss後才理解了題意 = =。

分析:

這題考察的是對前n項和的理解,因為要求連續子串行和,某連續子串行和[a,b]其實就是前b項和-前a-1項和的差。

而求最大值最小值就是求前b項和與前a-1項和的差最小,只要把每乙個前項和排序。

那麼最大值就是首尾兩項和的差(即前項和有正有負),首項的絕對值(均負),尾項(均正)。

最小值就是排序後相鄰前項和之間的最小差,或者是前項和絕對值的最小值。

優化分析

我就會乙個小優化 = =。 在輸入的時候就可以找出前項和絕對值的最小值。當最小值找出為0時就不需要繼續找,所以後面的迴圈條件裡面加個判斷是否為0。

發散

如果還要求這兩個子串行的上下界,那只要弄個結構體存它原本的位置就行了。

**

/*

* author: illuz * blog:

* file: 422.cpp

* lauguage: c/c++

* create date: 2013-08-29 19:01:05

* descripton: nyoj422.cpp

*/#include #include #include using namespace std;

#define repf(i, a, b) for (int i = (a); i <= (b); i++)

/****** template ends ******/

const int maxn = 1000100;

int t, m, a, s[maxn];

int main()

sort(s + 1, s + m + 1);

int max = max(max(abs(s[1]), s[m]), abs(s[m] - s[1]));

for (int i = 2; i <= m && min; i++)

min = min(s[i] - s[i - 1], min);

printf("%d\n", max - min);

} return 0;

}

NYOJ 422 字串和之差

字串和之差 時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 給出乙個數列,選出乙個連續非空子序列,使該序列的絕對值max最大,再選出乙個非空子序列 與第乙個序列的選擇無關 使該序列的絕對值min最小。輸出max與min的差值。輸入第一行是乙個整數m m 8 表示測試資料的組數...

NYOJ 題目442字串和之差(動態規劃)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 給出乙個數列,選出乙個連續非空子序列,使該序列的絕對值max最大,再選出乙個非空子序列 與第乙個序列的選擇無關 使該序列的絕對值min最小。輸出max與min的差值。輸入第一行是乙個整數m m 15 表示測試資料的組數。每組資料...

NYOJ 題目915 字串(字串,水題)

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述shiva得到了兩個只有加號和減號的字串,字串長度相同。shiva一次可以把乙個加號和它相鄰的減號交換。他想知道最少需要多少次操作才能把第乙個字串變換成第二個字串。你現在要去幫助他完成那個這個問題。輸入多組測試資料 每組資料有兩行...