原题链接:蓝桥杯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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复