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;
解决方法:
我觉得这个题目的考点就在这个大空间的上面。我还没有编,不过我觉得你可以考虑不存储这个大的数组,只处理当前输入的数字。
你可以观察一下给的两组数据,第一组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语言 吃糖果的主要内容,如果未能解决你的问题,请参考以下文章