C语言 吃糖果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 吃糖果相关的知识,希望对你有一定的参考价值。

题目描目
HOHO,Gardon终于从Speakless手上赢走了所有的糖果,但Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。
输入
第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。
输出
对于每组数据,输出一行,包含一个"Yes"或者"No"。
样例输入

2
3
4 1 1
5
5 4 3 2 1
样例输出
No
Yes

下面是我写的代码,思路什么的按说也对,但是一运行就出错,求教:
#include<stdio.h>
#include<stdlib.h>
#define maxn 1000000
int main()

int n,flag;
long kind;
int i,j,k;
int num[maxn];

scanf("%d",&n);

for(i=0;i<n;i++)
scanf("%d",&kind);
if(n>1&&n<=maxn)
for(j=0;j<kind;j++)
scanf("%d",&num[j]);
do
for(k=0;k<j;k++)
if(num[k]==num[j]) printf("No");flag=0;break;

if(flag==0) break;
if(k==j) printf("Yes");break;

if(flag==0) break;
if(k==j)break;

scanf("%d",&num[j]);
while(num[j]>0&&num[j]<=maxn);

if(flag==0) break;
if(k==j)break;

system("pause");
return 0;

是,你程序的问题就是 int num[maxn];这句话,这句话会造成堆栈溢出,它分配不了这么大的空间。

解决方法:
我觉得这个题目的考点就在这个大空间的上面。我还没有编,不过我觉得你可以考虑不存储这个大的数组,只处理当前输入的数字。

你可以观察一下给的两组数据,第一组4 1 1 , 4比剩下的数的和要大两个,所以如果把4当成一个,其他全部当成一个,那一边拿一个会导致4这边,最少剩一个,也就是先拿会剩一个。
所以,我觉得可以下这个结论,这对数中最大的数,比除他以外的其他数的和大2,那就是no。其他的我觉得都是yes。

所以,可以这么编。
输入n
for i = 1 ~ n

max;
sum;
输入kind
for j = 1~ kind

输入当前的数input
max 用来找到这堆数中最大的数
sum 用来记录总和。不过要注意sum也可能超,如果可以申明__int64类型就很简单了

if( (max - (sum-max)) >=2 ) 输出 no
else 输出 yes
参考技术A 我测试了几次,把你的#define maxn 定义的值改小了一点,我改成了100,程序可以正常运行了...估计1000000太大了吧,建议数组长度不要太大,语法上是没什么错,但是程序很可能就崩溃了,像你这个一样..你试试吧,把1000000改小一点!追问

可是题目有要求啊。。。

追答

那就再看下你的算法在逻辑上有错没,顺便检查一下数组有没有越界!

ZZNUOJ_用C语言编写程序实现1148:吃糖果(附完整源码)

题目描述

HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢连续两次吃一样的糖果,喜欢先吃一颗A种类的糖果,下一次换一种口味,吃一颗B种类的糖果,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。

输入

第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0 < N <= 1000000),表示糖果的种类。。第二行是N个数,表示每种糖果的数目Mi(0 < Mi <= 1000000)。

输出

对于每组数据,输出一行,包含一个"Yes"或者"No"。

样例输入

2
3
4 1 1
5
5 4 3 2 1

样例输出

No
Yes

完整源码:

以上是关于C语言 吃糖果的主要内容,如果未能解决你的问题,请参考以下文章

35-捡糖果

35-捡糖果

C语言 百炼成钢17

C语言猴子吃桃递归法

C语言猴子吃桃问题递归法

牛客练习赛7 购物