原题链接:蓝桥杯2014年第五届真题-分糖果
解题思路: 1.直接暴力破解,在每一轮里,每个小朋友手里最后的糖数为,自己原来的糖数减半+自己右边小朋友给自己的糖数,如果现在糖数为奇数,还要加上老师给的一个。
2.注意在算小朋友手里的糖时,要先让小朋友全部自己交换完,再判断奇偶,不要在小朋友一轮交换还未完成时,就进行判断,作者就犯过这个错误
3.注意小朋友每轮在获得右边小朋友糖果额同时自己也要分糖果给左边的小朋友,所以其实每个小朋友手里的糖果是原来糖果数减半后再加上右边小朋友的糖果数目,此时若为奇数,还要加上老师给的。
4.利用jud判断是否所有小朋友手里的糖果数目相同,若相同了,那就跳出循环
5.l利用count计数器,每次老师给糖果都要count++;
6.注意第一个小朋友的糖果给最后一个小朋友,为了避免之后找不到第一个小朋友手里初始糖果一半的数目,所以首先将第一个小朋友手里的初始糖果一半的数目记录下来。
参考代码:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int count=0;
int a[100];
int temp;
for(int i=0;i<n;i++){
cin>>a[i];
}
// 用于判断是否所有小朋友手里的糖都相同
int jud=0;
// 在外面套个循环,一直判断,知道所有数目一样
while(!jud){
// 小朋友先分糖,首先让每个小朋友手里的糖果减半
for(int i=0;i<n;i++){
a[i]=a[i]/2;
}
// 记录第一个小朋友糖果减半的数量
temp=a[0];
// 将糖果的一半给左边的小朋友
for(int i=1;i<n;i++){
a[i-1]+=a[i];
}
// 第一个小朋友给最后一个小朋友
a[n-1]+=temp;
// 判断哪些是奇数
for(int i=0;i<n;i++){
if(a[i]%2==1){
a[i]++;
count++;
}
}
jud=1;
// 判断所有小朋友变换后是不是一样
for(int i=0;i<n-1;i++){
if(a[0]!=a[i+1]){
jud=0;
}
}
}
cout<<count;
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复