Alibabaの筆記テスト3.30に
よると、主題はおそらくNiukeのディスカッションエリアからのものです。トピックの入力、出力、データ範囲も少し不明です。アイデアを見てみましょう。これらの詳細はQAQには関係ありません。間違いがあれば修正してください。
トピックワン(優秀チーム)
Xiaoqiangには養鶏場がnあり、最初はi養鶏場に[i]鶏がいます。他の養鶏場とは異なり、彼の養鶏場は毎日k羽の雛を追加します。Xiaoqiangは、最終的に最大数の養鶏場で半分の雛を販売します。養鶏場にx羽の鶏がいる場合、販売後、x / 2(切り捨て)のニワトリのみが残ります。暁強のn養鶏場でm日後に何匹の雛がいるかを尋ねますか?
アイデア:優秀なチーム
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100010;
int n,m,k;
int main() {
scanf("%d%d%d",&n,&m,&k);
priority_queue<ll> q;
ll x,base = 0;
for(int i = 0;i < n;++i) {
scanf("%lld",&x);
q.push(x);
}
for(int i = 0;i < m;++i) {
base += k;
x = (q.top()+base)/2;
q.pop();
q.push(x-base);
}
ll ans = base*n;
while(!q.empty()) {
ans += q.top();
q.pop();
}
printf("%lld\n",ans);
}
/*
3 3 100
100 200 400
925
*/
トピック2(単調スタック+ dp)
Xiaoqiangは長さnのシーケンスを取得しましたが、彼は非常に大きな数にのみ関心があったため、このシーケンスの連続サブシーケンスをランダムに選択し、このシーケンスの最大値を求めました。この最大値の期待値を教えてください。
アイデア:単調なキュー+ dp。
これは、iで終わるサブシーケンスの予想される最大値を意味します。
jの位置、jの前の値はiとは関係なくjに関係し、直接取る
それだけです。伝達方程式は
、どこ
(すべてのケースの数)、最初のより大きい
位置jは単調スタックにすることができます。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1000010;
int n;
int a[maxn];
double dp[maxn];
int main() {
scanf("%d",&n);
for(int i = 0;i < n;++i) {
scanf("%d",&a[i]);
}
double base = 1.0*n*(n+1)/2,ans = 0;
stack<int> st;
for(int i = 0,j;i < n;++i) {
while(!st.empty() && a[st.top()] <= a[i])
st.pop();
j = st.empty() ? -1:st.top();
dp[i] = 1.0*(i-j)*a[i]/base;
if(j != -1) dp[i] += dp[j];
ans += dp[i];
st.push(i);
}
printf("%.6f\n",ans);
}
/*
3
1 2 3
2.333333
*/