錒鯉2020-3-30 bst

n個養雞場,

  • 初始a[i]只雞。
  • 每天增k只
  • 每天結束都會在數量最多的養雞場裏賣掉一半的小雞,
    • 有x只雞,則賣出後只剩下x/2(向下取整)只雞。
  • m天后小強的n個養雞場一共多少隻小雞?

  • 第一行輸入三個int類型n,m,k(1 <= n,m,k <= 10^6)
  • 第二行輸入n個正整數,表示n個養雞場初始雞的個數
  • 出 輸出一個整數表示雞的總數

在這裏插入圖片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
intmain(){
    int n,m,k,t;
    ll base(0),sum(0);
    scanf("%d%d%d",&n,&m,&k);
    priority_queue<int> heap;//默認大根堆
    for(int i = 0; i < n; i++){
        scanf("%d", &t);
        heap.emplace(t);
        sum += t;
    }
    for(int i = 0;i < m; i++){
        base += k;
        t = heap.top() + base;
        int d = (t + 1) / 2;
        heap.pop();
        heap.emplace(t - d - base);
        sum -= d;
    }

    printf("%lld\n",base * n + sum);

}

長度爲n的序列,

  • 隨機選擇一個連續子序列,並求這個序列的最大值,
    • 最大值的期望
  • 輸入 第一行n表示序列長度
  • n個數描述這個序列,
  • n大於等於1小於等於1000000,數字保證是正整數且不超過100000
  • 保留6位小數

在這裏插入圖片描述

  • 總的序列數= n+(n-1)+…+2+1 = n*(n+1)/2 個,概率相同
  • x[i]爲結尾的子序列,這些子序列中有兩種情況
    • 一種是最大值爲x[i],
    • 一種是最大值不爲x[i];
    • 最大值不爲x[i]的相當於x[i]沒有加入,可以藉助之前的狀態求解;最大值爲x[i]的情況只需記錄有多少個。
  • 用單調棧的思路,從大到小存放出現的元素,並記錄值對應的index值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 1000006;
double dp[N];//dp[i]表示前i個數中的最大值期望
intmain(){
    int n,t;
    scanf("%d",&n);
    ll c = (ll)n * (n + 1) / 2;
    dp[0] = 0;//無意義
    stack<PII> m;
    double res = 0;
    for(int i = 0;i < n; i++){
        scanf("%d",&t);
        while(!m.empty() && m.top().first <= t){
            m.pop();
        }
        int d = m.empty()?i + 1 : i-m.top().second;
        dp[i + 1] = 1.0 * t *d / c + dp[i + 1 - d];
        res += dp[i + 1];
        m.emplace(t,i);
    }
    printf("%.6f\n",res);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章