思路
其实就是一道数学题。
设每座山的水量为 $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;
}
标签:int,Dams,题解,into,tot,tot2,cdots,ans
From: https://www.cnblogs.com/WuMin4/p/18371959