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);
}