アリチュン採用筆記試験2020.3.30(優秀チーム/単調スタック/ dp)

Alibabaの筆記テスト3.30に
よると、主題はおそらくNiukeのディスカッションエリアからのものです。トピックの入力、出力、データ範囲も少し不明です。アイデアを見てみましょう。これらの詳細はQAQには関係ありません。間違いがあれば修正してください。

トピックワン(優秀チーム)

Xiaoqiangには養鶏場がnあり、最初はi養鶏場に[i]鶏がいます。他の養鶏場とは異なり、彼の養鶏場は毎日k羽の雛を追加します。Xiaoqiangは、最終的に最大数の養鶏場で半分の雛を販売します。養鶏場にx羽の鶏がいる場合、販売後、x / 2(切り捨て)のニワトリのみが残ります。暁強のn養鶏場でm日後に何匹の雛がいるかを尋ねますか?
1 < = メートル k < = 1 0 6 1 <= n、m、k <= 10 ^ 6
アイデア:優秀なチーム

#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のシーケンスを取得しましたが、彼は非常に大きな数にのみ関心があったため、このシーケンスの連続サブシーケンスをランダムに選択し、このシーケンスの最大値を求めました。この最大値の期待値を教えてください。 1 < = < = 1 e 6 1 < = a i < = 1 e 5 1 <= n <= 1e6,1 <= a_i <= 1e5
アイデア:単調なキュー+ dp。 d p i dp_i これは、iで終わるサブシーケンスの予想される最大値を意味します。 a i a_i jの位置、jの前の値はiとは関係なくjに関係し、直接取る d p j dp_j それだけです。伝達方程式は d p i = ( i j ) a i / b a s e + d p j dp_i =(ij)* a_i / base + dp_j 、どこ b a s e = n ( n + 1 ) / 2 底= n *(n + 1)/ 2 (すべてのケースの数)、最初のより大きい a i a_i 位置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
*/
公開された152元の記事 ウォンの賞賛2 ビュー6445

おすすめ

転載: blog.csdn.net/weixin_43918473/article/details/105270231