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

浙公网安备 33010602011771号