問題 b: 無聊遊戲
時間限制: 1 sec 記憶體限制: 128 mb
提交: 96 解決: 18
[提交] [狀態] [命題人:admin]
題目描述
小n和小a在玩這樣的乙個遊戲:給定初始數列q,小n先把某個字首(可以為空)的數字全部乘上−a,小a再把某個字尾(可以為空)的數字全部乘上−b,小n想讓最後所有數的和盡量大,而小a想讓最後所有數的和盡量的小。
因為小a無比聰明絕對不會失誤,所以小n想找到某個方法使得最後所有數的和盡量大,請幫助小n求出最大的值是多少吧。
輸入第一行三個正整數n,a,b,表示數列的長度和小n小a乘的數。
第二行有n個整數表示數列q。
輸出輸出一行乙個整數s,表示最後數列的和的最大值。
複製樣例資料
3 1 1樣例輸出-1 -2 -3
0提示
如果小n修改前0個數,那麼小a修改後0個數,數列是,和為−6。
如果小n修改前1個數,那麼小a修改後0個數,數列是,和為−4。
如果小n修改前2個數,那麼小a修改後0個數或後3個數,數列是或,和為0。
如果小n修改前3個數,那麼小a修改後3個數,數列是,和為−6。
最後答案是max=0。
對於50%的資料,有n≤5000。
對於70%的資料,有n≤100000。
對於100%的資料,有n≤1000000,1≤a,b≤100,∣qi∣≤109。
sum是字首和
對於小n修改前p個數,小a如何修改能使所有數的和盡量小呢?很明顯,你並不能清楚的知道小a要如何修改(廢話)
但是,小a的修改無非就以下幾種情況
設小n修改到p位置,小a修改到q位置(1<=q<=n)
1.p要使這個式子最小,那麼就要使sum[q-1]最小,因為p2.p<=q,整理可得-a*(1+b)*sum[q-1]+b*(1+a)*sum[p]-b*sum[n]
要使這個式子最小,那麼就要使sum[q-1]最大,因為1<=q<=p,所以0<=q-1<=p-1可以注意到假設的時候只說了q的範圍,並沒有說p的範圍,
首先p屬於[1,n]沒有問題,很明顯p=0的時候,用字首和求出來的也沒問題,所以上述式子中的p的範圍是[0,n],也就是說包括了小n修改的字首是空的情況
但是並不能包括小a修改的字尾為空的時候,因為小a修改的那段區間的值是用sum[n]-sum[x],即式子是在小a必修改的情況小推出來的,但是小a也可以不修改
3.小a不修改-a*sum[p]+sum[n]-sum[p]
那麼哪一種能讓和最小呢,這幾種情況取最小值唄
所有最小值的最大值就是答案
關於模糊問題,這幾天做題也遇到過幾道
1.小車過線問題,後面的車可能會被前面的車所限制,那麼最後一輛車到底會被哪輛車為首的「車隊」限制呢?咱也不會求
假設是第i輛車為首限制的,那麼可以求出乙個時間,列舉每乙個i,時間最長那個就是答案
具體問題看這吧
#includeusing namespace std;
typedef long long ll;
const int n=1e6+5;
ll sum[n];
ll minsum[n];//minsum[i]表示[i,n-1]內最小的字首和
ll maxsum[n];//maxsum[i]表示[0,i]內最大的字首和
int n,a,b;
inline ll f1(int p)
inline ll f2(int p)
inline ll f3(int p)
int main()
maxsum[0]=0;
for(int i=1;i<=n;i++)
maxsum[i]=max(maxsum[i-1],sum[i]);
minsum[n]=1e18;
for(int i=n-1;i>=0;i--)
minsum[i]=min(minsum[i+1],sum[i]);
ll ans=-1e18;
for(int i=0;i<=n;i++)
else if(i==0)
else
}printf("%lld\n",ans);
return 0;
}
取石頭遊戲 博弈論 數學規律
兩個足夠聰明的人玩輪流取石頭的遊戲,誰取到最後乙個石頭誰就贏了,他們一次只能取1個 3個 7個或 8個石頭,寫一程式判斷 n個石頭時先取的人是輸還是贏。輸入格式 多組輸入,乙個整數 n,其值不超過 10000000。輸出格式 如果先取的人贏,請以單獨一行輸出 1,否則輸出0。輸入樣例 1 10300...
博弈分析(取石子遊戲的數學問題)
取石子問題 有一種很有意思的遊戲,就是有物體若干堆,可以是火柴棍或是圍棋子等等均可。兩個人輪流從堆中取物體若干,規定最後取光物體者取勝。這是我國民間很古老的乙個遊戲,別看這遊戲極其簡單,卻蘊含著深刻的數學原理。下面我們來分析一下要如何才能夠取勝。一 巴什博奕 bash game 只有一堆n個物品,兩...
問題 穀神的賭博遊戲 數學思維 排列組合
neuq 的穀神要和我賭乙個遊戲 穀神要求我隨機在紙上寫出整數集合 n 是整數 的乙個排列 即不重複的隨機寫出從 1 到 3n 1 的所有整數 並且要求在我寫的過程中,從我寫的第乙個數開始一直加到我正在寫的數的總和不被 3 整除。如果我能寫出來符合要求的乙個排列,那麼我就贏得遊戲。那麼問題來了,我贏...