解题思路:思路很简单,就是模拟题目的过程,不过可能算法上还能优化一下时间。
注意事项:
题目说“每个小朋友都把自己的糖果分一半给左手边的孩子。 ”我一开始以为是分一半给左边后,左边的加上那一半再去分,结果一直只对百分之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语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:530 |
【计算两点间的距离】 (C语言代码)浏览:927 |
母牛的故事 (C语言代码)浏览:478 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:998 |
最小公倍数 (C语言代码)浏览:894 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:701 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:863 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:388 |
关于float,double变量的几点说明浏览:1926 |
简单的a+b (C语言代码)浏览:618 |