題目雖然是中文的,但說的不是很清楚,求的是連續子串行和的絕對值的最大值和最小值,然後求兩個絕對值的差。
剛開始還以為是最大連續子串行和的問題,發現不一樣,想了一會樣例,然後看了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一次可以把乙個加號和它相鄰的減號交換。他想知道最少需要多少次操作才能把第乙個字串變換成第二個字串。你現在要去幫助他完成那個這個問題。輸入多組測試資料 每組資料有兩行...