解题思路:
基本思路是采用两个数组,一个存放输入的初始数组a[105],一个存放初始数组的一半b[105]。当然,a和b数组的值会一直更新。
因为题目是把糖果给左边的小孩,所以就相当于在b数组中存放的数据对于a数组来说是整体向左移动一格。这意味着循环的时候,可以从1开始,而非从0开始。
所以每一次给糖果,就是把a和b数组对应的格子的值相加,当为a的第N格时候,这时候a数组加的是b数组的第一个,因为第一个小孩的糖果的一半要给左边的小孩,那第一个的左边只能是最后一个。
注意事项:
数组一定要初始化,不然会陷入死循环,输出错误等问题。
参考代码:
#include<iostream> using namespace std; int main() { int N; int a[105]={0};//初始数组 int b[105]={0};//初始数组的一半 int count=0;//老师给的糖果数 int flag=1;//标志位 cin>>N; for(int i=1;i<=N;i++)//注意我的每个for循环的开始都是从i=1开始,原因在最开始说过了 { cin>>a[i]; } while(flag) { for(int i=1;i<=N;i++)//这个for循环是实现a数组的每个值减半并赋值给b数组的对应格子 , { a[i]/=2; b[i-1]=a[i]; } for(int i=1;i<=N;i++) { if(i==N)a[i]+=b[0];//如果循环到最后一格,那么它得到的糖果应该是第一个给的糖果,所以是+b[0] else a[i]+=b[i];//其他情况就是对应格子相加 if(a[i]%2!=0)//判断a数组对应格的值是否为偶数,不是则老师发糖count++ { a[i]++; count++; } } for(int k=1;k<=N;k++) { if(a[k]==a[k+1]) { if(k==N-1) flag=0;//判断每个是否相等,判断成功则标志位置0,用于跳出while循环 continue; } else break; } } cout<<count; }
0.0分
1 人评分