標籤:space 不用 max 最大的 應該 return 比較 clu pac
UVa11059Maximum Product
題意
給一串整數S,你需要找到其連續子序列中乘積最大的那個,輸出其乘積。如果找到的答案不是正數,那麼輸出0,表示無解。
另外注意:每組輸入後面都有一行空格,每組輸出後面也應該有一行空格。輸入以EOF結束。
然後,按照UVa中的資料範圍,它不是很大,差不多就是: 1<=n<=18,-10<=s[i]<=10;
本人思路:
因為是最大乘積+連續子序列,所以這就是一個連乘題目 當然首先的一個思路就是暴力如下:
那麼在這麼小的資料範圍內,一個longlong即可,因為數內有負數,所以我們可以先搜尋一遍是否擁有負數,若沒有,就把整個S數組乘起來,或者負數的個數共有偶數個也可以乘起來
such as this:
ans*=s[i]
若有負數且不為偶數個,那麼就暴力搜尋子序列中乘積最大的值,然後輸出正解即可,這裡的這個你可以認為是首碼和變成首碼乘
(那啥,這個代碼我沒寫我用的是另一種思路,上面這個比較好理解)
另一種思路:
直接暴力(本人走暴力流)
連續子序列的兩種要素:起點和終點。
這裡和上面的第二部有些類似,需要枚舉起點和終點的位置即所有連續子序列。對於其中元素來說,只需要枚舉出全部連續子序列然後計算乘積比較就行。
對於其中的乘積不會超過10^18,所以爆搜加一個longlong就可以解決問題
釋放代碼(蠢蠢欲動的代碼)
#include<iostream>#include<cstdio>#include<algorithm> using namespace std;long long s[105];//數組,來存的 int main(){ int n; int cnt=0;//這個是用來計算第幾個解的 while(cin>>n){ long long ans=0; for (int i=0;i<n;++i) cin>>s[i]; for (int i=1;i<=n;++i){ for (int j=0;j+i<=n;++j){ //這裡的j是子序列的起點,從0開始找 long long jishu=1;//這個計數器是用來比較連續子序列乘積與ans原數的大小 //相當於計算機裡的 M+ (笑) for (int k=j;k<j+i;++k){ //確定不同的終點 jishu*=s[k];//連乘 //嘗試輸出jishu,你就可以知道運行多少次 //cout<<jishu<<endl;(不用謝) } ans=max(ans,jishu);//開始比較,並且換上較大的數到ans中 } } printf("Case #%d: The maximum product is %lld.\n\n",++cnt,ans);//我認為這個輸出比較麻煩 //不要忘記\n } return 0;}
最近的一篇題目