UVa 11059 最大乘積(列舉)
阿新 • • 發佈:2019-02-01
輸入n個元素組成的序列s,你需要找出一個乘積最大的的連續子序列。如果這個最大的的乘積不是正數,輸出-1.1<=n<=18,-10<=Si<=10;
樣例輸入: 3 2 4 -3 5 2 5 -1 2 -1 樣例輸出:
8 20
分析:連續子序列有兩個要素:起點和終點,因此只需列舉起點和終點即可。由於每個元素的絕對值不超過10,一共又不超過18個元素,最大可能的乘積不會超過10^18,可以用long long 存下。
樣例輸入: 3 2 4 -3 5 2 5 -1 2 -1 樣例輸出:
8 20
分析:連續子序列有兩個要素:起點和終點,因此只需列舉起點和終點即可。由於每個元素的絕對值不超過10,一共又不超過18個元素,最大可能的乘積不會超過10^18,可以用long long 存下。
#include <stdio.h> int main() { int n, a[20]; while (scanf("%d", &n) == 1) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); long long max = 0; for (int i = 0; i < n - 1; i++) { //列舉起點 for (int j = 1; j < n; j++) { //列舉終點 long long num = 1; for (int k = i; k <= j; k++) { num *= a[k]; } if (max < num) max = num; } } printf("%lld\n", max); } return 0; }
#include <stdio.h> int main() { int n, a[20]; while (scanf("%d", &n) == 1) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); long long max = 0; for (int i = 1; i <= n; i++) { <span><span></span><span class="comment"> // i:子序列長度 </span><span></span></span> for (int j = 0; j + i <= n; j++) { <span><span class="comment">// j:子序列起點</span></span> long long num = 1; for (int k = j; k < j + i; k++) <span><span></span><span class="comment">// 累乘</span></span> num *= a[k]; if (num > max) max = num; } } printf("%lld\n", max); } return 0; }