題目描述
一天,ykc在學校閒的無聊,於是決定上街買點吃的,ykc很懶,本來就不是很像逛街,於是找來了czl幫他買,這裡應該有滑稽,而czl也不願為ykc買東西吃,但是ykc很強勢,非讓他去買,呢沒辦法了,然而czl還有很多事要做,沒呢麼多時間幫ykc,而這條小吃街又很長,有n家店,n有50000這麼大,並且這n家店的商品價值有所不同(要知道,商品的價值可能為負,哈哈,很神奇吧,但是czl肯定不會傻到賠錢,所以***),哇,czl要瘋了,他不想逛這麼久啊,他還有個毛病,他只會連續的逛若干家店,並且由於這條街的店很多,所以肯定不會是一條直線,換句話說就是首尾相連,即第n家店和第一家店是連在一起的,然而ykc希望czl買的東西價值最大,不然就會不開心,於是他就把艱難的任務交給你了,他真的不想浪費時間,你能幫助他嗎?
輸入第1行:小吃街的長度n(2 <= n <= 50000)
第2 - n+1行:n個整數,代表每個店的商品價值 (-10^9 <= s[i] <= 10^9)
輸出czl能買到的最大價值
樣例輸入
6 -2 11 -4 13 5 -2
樣例輸出
解題思路:子段總和=最大子段和+最小子段和。
我們先定義一下:比方說我們從第i個店開始找,把i和i之前的那個店的位置定義為「缺口」。根據題意一共有兩種情況;
第一種是不經過缺口的,那麼這個環狀子段就和普通的線狀子段是一樣的了。
第二種情況是經過了缺口的,那麼就根據上面的公式,最大子段和=子段總和-最小子段和。因為這時最大子段和經過了缺口,所以最小子段和肯定不經過缺口。我們再開乙個陣列存放原先子段的相反數,用原先求最大子段和的方式可以很容易求出最小子段和。
#include
#include
#include
#include
#include
using namespace std;
long
long n;
long
long a[99999];
long
long b[99999];
int main()
long
long maxx=0;
for(long
long i=0;isum+=a[i];
if(sum>maxx)
maxx=sum;
if(sum
<0)
}//這是第一種情況,
sum=0;
long
long maxx2=0;
for(int i=0;isum+=b[i];
if(maxx2<=sum)
maxx2=sum;
if(sum
<0)
}//第二種情況。
printf("%lld\n",max(maxx,maxx2+ans));
}return
0;}
HAUTOJ 1282 ykc想吃好吃的
hautoj ykc想吃好吃的 題目描述 一天,ykc在學校閒的無聊,於是決定上街買點吃的,ykc很懶,本來就不是很像逛街,於是找來了czl幫他買,這裡應該有滑稽,而czl也不願為ykc買東西吃,但是ykc很強勢,非讓他去買,呢沒辦法了,然而czl還有很多事要做,沒呢麼多時間幫ykc,而這條小吃街又...
回文數猜想(1282)
問題描述 problem description 乙個正整數,如果從左向右讀 稱之為正序數 和從右向左讀 稱之為倒序數 是一樣的,這樣的數就叫回文數。任取乙個正整數,如果不是回文數,將該數與他的倒序數相加,若其和不是回文數,則重複上述步驟,一直到獲得回文數為止。例如 68變成154 68 86 再變...
wikioi 1282 約瑟夫問題
這道題所用到的資料結構應該是名次樹,名次樹可以由線段樹實現也可以由樹狀陣列實現。而對於類似這道題這樣的乙個只需要刪除和查詢操作的名次樹而言,可以用樹狀陣列實現,因為用樹狀陣列實現無論效率還是 複雜度都較線段樹而言更優,雖然演算法較線段樹而言更加巧妙。首先,這個資料結構需要乙個用於查詢第k名是什麼的函...