1月4号 C题 分糖果

时间: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值