程序媛小秒


私信TA

用户名:uq_95485294184

访问量:1076

签 名:

等  级
排  名 5536
经  验 1527
参赛次数 0
文章发表 15
年  龄 0
在职情况 学生
学  校 武汉轻工大学
专  业

  自我简介:

TA的其他文章

通俗易懂C++
浏览:29

解题思路: 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 人评分

  评论区

  • «
  • »