时间:1s 空间:256M
题目描述:
一个班里有n个男生站成一圈,每两个男生之间站着一个女生,共n个女生,男女生分别按顺时针编号依次为1号,2号,以此类推。i号女生站在i号和i+1号男生中间(n+1号男生即1号男生)。
老师依次给男生们发糖,每个男生会收到不少于0的偶数颗糖且会把全部糖果等量分给左右两边的女生。最后第i名女生总共收到了ai颗糖。请计算老师分别给每个男生发了多少糖。
保证n是奇数,可以证明答案唯一。
输入格式:
第一行,包含一个正整数 n,表示男、女生人数。 第二行,包含n个整数a1,a2,...,an,表示每个女生收到的糖果数。
输出格式:
输出n个整数,表示老师分别给每个男生发的糖果数。
样例1输入:
3
2 4 6
样例1输出:
4 0 8
约定与提示:
对于100%的数据,3≤n≤105−1;0≤ai≤109。
样例解释:
1,3,5位置是男生,2,4,6位置是女生,初始序列为 [4,0,0,0,8,0] ,目标序列为 [0,2,0,4,0,6]。
1号男生分别给1号和3号女生2颗糖,序列变为 [0,2,0,0,8,2]。
3号男生分别给2号和3号女生4颗糖,序列变为 [0,2,0,4,0,6]。
题意:
此题是一道数学题只要求出总和与每个算式,得出一个就可以解出答案
思路:
我们设男生拿了bi个,女生有ai个,根据样例解释也可得出:
b1/2+b2/2=a1
b2/2+b3/2=a2
b3/2+b1/2=a3
即可推出:
b1+b2=2*a1;
b2+b3=2*a2;
b3+b1=2*a3;
sum=a1+a2+a3=12;
再可以根据此求出第一位男生的糖果,接着可以算出所有的男生有的糖果for example: b1=sum-(b2+b3)=12-8=4
上面就是基本思路,下面附上写代码时用上的步骤:
观察等式如果再多举几个例子
例如:
b1+b2;
#b2+b3
b3+b4
#b4+b5
b5+b1
(打#号指需要用于求b1的算式)
sum-(b2+b3)-b4+b5就可以求出b1
b2+b3所代表的是第二位女生的糖果数2.b4+b5是第四位女生的糖果数 2都是二的倍数的女生的糖果数 *2
所以有了此公式b1=sum-所有是二的倍数的女生的糖果数*2
既然算出b1,再根据一个个等式代b1+b2=?,b2=?-b1;b2+b3=?,b3=?-b2......就这样输出就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005];
int ans[100005];
int sum=0;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];//sum求出所有糖果总量
}
for(int i=1;i<=n;i++){
ans[i]=a[i]*2;
}
for(int i=1;i<=n;i++){
if(i%2==0){//让sum-所有是二的倍数的女生的糖果数*2
sum-=a[i]*2;
}
}
b[1]=sum;
for(int i=1;i<=n;i++){
b[i+1]=ans[i]-b[i];
//因为上面存好了ans(即那些等式的结果),
//比如第一个等式就是b1+b2的结果),从b[2]开始,b[2]=ans(b2+b1)-b[1],以此类推。。。。。。
}
for(int i=1;i<=n;i++){
cout<<b[i]<<" ";
}
return 0;
}