HDU 5696 区间的价值 暴力
生活随笔
收集整理的這篇文章主要介紹了
HDU 5696 区间的价值 暴力
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
區間的價值
題目連接:
http://acm.hdu.edu.cn/showproblem.php?pid=5696
Description
我們定義“區間的價值”為一段區間的最大值*最小值。
一個區間左端點在L,右端點在R,那么該區間的長度為(R?L+1)。
現在聰明的杰西想要知道,對于長度為k的區間,最大價值的區間價值是多少。
當然,由于這個問題過于簡單。
我們肯定得加強一下。
我們想要知道的是,對于長度為1~n的區間,最大價值的區間價值分別是多少。
樣例解釋:
長度為1的最優區間為2?2 答案為6?6
長度為2的最優區間為4?5 答案為4?4
長度為3的最優區間為2?4 答案為2?6
長度為4的最優區間為2?5 答案為2?6
長度為5的最優區間為1?5 答案為1?6
Input
多組測試數據
第一行一個數n(1≤n≤100000)。
第二行n個正整數(1≤ai≤109),下標從1開始。
由于某種不可抗力,ai的值將會是1~109內隨機產生的一個數。(除了樣例)
Output
輸出共n行,第i行表示區間長度為i的區間中最大的區間價值。
Sample Input
5
1 6 2 4 4
Sample Output
36
16
12
12
6
Hint
題意
題解:
數據全隨機有什么好說的呢?n^2的算法很顯然,剪剪枝就過了
直接暴力枚舉哪一個數是這個區間的最大值就好了
然后左右擴展,然后暴力莽一波就好了……
代碼
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+6; int n; long long a[maxn]; long long dp[maxn]; void solve() {memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++){dp[1]=max(dp[1],a[i]*a[i]);int l=i,r=i;long long Min=a[i];while(1){if(r-l+1==n)break;if((l!=1)&&(r==n||a[l-1]>a[r+1]))Min=min(Min,a[--l]);else Min=min(Min,a[++r]);if(a[l]>a[i]||a[r]>a[i])break;dp[r-l+1]=max(dp[r-l+1],a[i]*Min);}}for(int i=1;i<=n;i++)printf("%lld\n",dp[i]); } int main() {while(scanf("%d",&n)!=EOF)solve(); }轉載于:https://www.cnblogs.com/qscqesze/p/5522325.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的HDU 5696 区间的价值 暴力的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第四百一十六天 how can I 坚持
- 下一篇: 通过java反射机制获取该类的所有属性类