[ABC133D] Rain Flows into Dams

思路

其实就是一道数学题。

设每座山的水量为 \(ans_i\),大坝的水量为 \(w_i\),则根据题意可以得到以下方程:

\[\begin{cases}w_i=\frac{ans_i+ans_{i+1}}{2}&i<n\\w_i=\frac{ans_i+ans_1}{2}&i=n\end{cases} \]

所以只要求出任意一个 \(ans\) 就可以求出剩余的 \(ans\),这里我选择求 \(ans_1\) 的值。

将所有 \(w_i\) 加起来可以得到:

\[w_1+w_2+\cdots+w_n=ans_1+ans_2+\cdots+ans_n \]

将所有 \(i\) 为奇数的 \(w_i\) 加起来可以得到:

\[w_1+w_3+\cdots+w_n=\frac{2ans_1+ans_2+\cdots+ans_n}{2} \]

于是将第二个式子的两倍与第一个式子相减便可以得到 \(ans_1\)

剩下的 \(ans\) 就一个一个推就行了。

代码

#include<bits/stdc++.h>
using namespace std;
int n,a[100005],tot,tot2;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		tot+=a[i];
		if(i%2==1) tot2+=a[i];
	}
	tot2=tot2*2-tot;
	cout<<tot2<<" ";
	a[0]=tot2;
	for(int i=1;i<=n-1;i++){
		a[i]=a[i]*2-a[i-1];
		cout<<a[i]<<" ";
	}
	return 0;
}

posted @ 2024-08-21 16:33  WuMin4  阅读(23)  评论(0)    收藏  举报