解题思路:
将每个人糖果的一半分给下一个人,首先自然而然想到用数组记录每人的糖果数,i=1 表示从第一个开始,
其次 每人分出去一半,是同时进行,不是从一开始顺序分出一半,这是两种解法。
关于记录分出去的一半糖果数,我也是用另一个数组记录,其次就是数学与逻辑的整合啦,看代码吧!
注意事项:
此题注意理解题意要理解透彻,把过程想明白。
参考代码:
#include<stdio.h>
main()
{
int n,i,f,m,c=0;
int a[100],b[100];
scanf("%d",&n); //输入n个人
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]); // 输入每个人的初始糖果数
}
while(1)
{
f=1; // f=1,用来下面判断是否每人糖果数一致
for(i=1;i<=n;i++)
{
a[i]=a[i]/2; //首先同时发生,先让每个人糖果数目减半
b[i]=a[i]; //减少的就是要分给下一个人的,用b数组记录
}
b[0]=b[n]; //此处给b【0】赋予最后一个人分发的糖果数
for(i=1;i<=n;i++) //(i从1开始)可以使每个人得到的糖果都来源于下一个人 a[i]=a[i]+b[i-1];
{
a[i]=a[i]+b[i-1]; //每一轮分糖果,每个人最后的糖果数
}
for(i=1;i<=n;i++)
{
if(a[i]%2!=0)
{
a[i]=a[i]+1;
c++; //如果不是偶数,则c(补充的糖果数)+1
}
}
for(i=1;i<n;i++)
{
if(a[1]!=a[i+1])
{
f=0; // 如果都不等于第一个人的数目,大家数目不一样,f为0,继续循环
}
}
if(f==1)
{
break; // 一样。则跳出while循环,输出增加糖果数目
}
}
printf("%d",c);
}
0.0分
4 人评分
佬,我没太弄懂这题的意思,如果是三个人,第一个给第二个,第二个给第三个。第三个是给第二个吗?第三个的左手边是第一个还是第二个
白的像碳 2022-09-21 22:15:10 |
注意看题,小朋友围成一圈
int fun(int N, int a[])//判断每个小朋友的糖果是否相等 { for (int i = 0; i < N-1; i++) { if (a[i] != a[i + 1]) return 0; } return 1; } int main() { int N, a[100], b[100], i, k=0; scanf("%d", &N); for ( i = 0; i < N; i++) { scanf("%d", &a[i]); } while (!fun(N,a))//不相等进入循环 { for (i = 0; i < N; i++)//利用两个数组,我这b[]是从1开始的,将a[]里的元素分一半给b { b[i+1] = a[i] / 2; a[i] = b[i+1]; } for (i = 1; i < N; i++)//从第二个元素开始a,b元素一一相加 { a[i] += b[i]; } a[0] =a[0] + b[N];//a[0]和b[N]相加 for (i = 0; i < N; i++) { if (a[i] % 2 != 0)//判断每个小朋友的糖果是否为偶数 { a[i] += 1; k++; } }
/* 3 2 2 4 1 1 2 1+1=2 1+2=3 2+1=3 2 4 4 1 2 2 2 2 2*/ #include<stdio.h> int main(){ int a[105]; int n,sum=0;//标记补发的糖果 scanf("%d",&n); int i,z; int tag; for(i=0;i<n;i++){//输入每个小孩的糖果数量 scanf("%d",&a[i]); } while(1){//开始循环 tag=0;//作为标记 if(a[0]%2==0){ z=a[0]/2;// Z 为第一个小孩减半后的糖果数量 } else{ z=(a[0]+1)/2; } for(i=0;i<n;i++){ if(a[i]%2==1){//从头至尾 糖果数若是双数则直接减半 单数就加一在减半 记入补发的数目 a[i]+=1; sum++;// 单数的情况 将补发的糖果数 记入 } a[i]/=2; if(a[i]!=z){ tag=1;//若是 有小孩的糖果数不等于第一个小孩的数目 则
while(1) { f = 1; for (i=n-1; i>=0; i--) { a[i] += a[(i+1)%n]/2; a[(i+1)%n] = (a[(i+1)%n]+1)/2; } for (i=0; i<n; i++) { if (a[i]%2 == 1) { len++; a[i] += 1; } } for(i=0;i<n-1;i++) { if(a[0]!=a[i+1]) { f = 0; } } if(f==1) { break; } } 怎么就超时了呢?
Spperman 2019-05-05 13:13:49 |
f==1 才退出while(1)的死循环,你的没有f=1赋值的条件,因此之后f总是0 无法break
b[i]=a[i]; //较少的就是要分给下一个人的,用b数组记录 这句不懂
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:494 |
C语言训练-阶乘和数* (C语言代码)浏览:982 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:1448 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:879 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:665 |
1009题解浏览:746 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1459 |
星期判断机 (C语言代码)浏览:859 |
演讲大赛评分 (C语言代码)浏览:1629 |
GC的苦恼 (C语言代码)浏览:620 |