原题链接:蓝桥杯2014年第五届真题-分糖果
解题思路:
基本思路是采用两个数组,一个存放输入的初始数组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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复