原题链接:蓝桥杯2014年第五届真题-分糖果
解题思路:思路很简单,就是模拟题目的过程,不过可能算法上还能优化一下时间。
注意事项:
题目说“每个小朋友都把自己的糖果分一半给左手边的孩子。 ”我一开始以为是分一半给左边后,左边的加上那一半再去分,结果一直只对百分之60,还有两个测试点过不去,结果看了题解,发现是减半后先临时保存起来,等全部孩子都减半后再去分配。这样就避免了除以奇数,导致有精度误差(而且这样分配的后果是,最后一个小朋友的数目永远最少),而且如果按照我的思路去分配,最后会发现有那种全部都是偶数了,但是还是都不相等的情况,(这个是我跟踪发现的)我还以为要做什么方法,在中间去优化,结果发现是自己理解错了题目........。太坑了啊......
参考代码:我是根据每轮判断是否相等,来维持循环,其实可以通过老师发糖的循环里面去判断,这样可以节省时间
#include<iostream>
#include<cmath>
using namespace std;
int n;
int a[101];
bool all()
{
bool ok = true;
int i =0;
for(i = 0;i<n-1;i++)
{
if(a[i]!=a[i+1])
{
return false;
}
}
return ok;
}
int main()
{
int sum = 0;
cin>>n;
int i =0;
for(int i =0;i<n;i++)
{
cin>>a[i];
}
while(all()==false)
{
int ok = 0;
for(i = 0;i<n;i++)
{
a[i]/=2;
}
int temp = a[n-1];
for(i = n-1;i>0;i--)
{
a[i]+=a[i-1];
}
a[0]+=temp;
for(i = 0;i<n;i++)
{
if(a[i]%2!=0)
{
a[i]+=1;
sum++;
}
else
{
ok++;
}
}
//最后全为偶数
// if(ok == n)
// {
// for(i = 0;i<n-1;i++)
// {
// if(a[i]-a[i+1] == 0)
// {
// continue;
// }
// else
// {
// sum = sum + abs(a[i]-a[i+1]);
// if(a[i]>a[i+1])
// {
// a[i+1] = a[i] - a[i+1] + a[i+1];
// }
// else
// {
// a[i] = a[i+1] - a[i]+a[i];
// }
// }
// }
// }
}
cout<<sum<<endl;
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复