编程挑战赛的两个问题,不知道错在那里了。

小白yige 2014-11-05 01:38:36
第一题是编程俱乐部里面的一个糖果问题
如下:
有n个小朋友站成一排(编号从0到n-1),每个小朋友有一个rating值,存放在ratings数组中。老师需要给他们分配糖果,每个小朋友至少需要一颗糖果,对于任意相邻的两个小朋友i和i+1,rating值大的必须比rating值小的分配的糖果多(rating相同的没必要分配一样多的糖果)。
请计算最少需要多少颗糖果,才能完成上述分配。
输入格式:
多组数据,每组数据第一行是一个正整数n。
接下来n行,每行有1个正整数,表示每个小朋友的rating值。所有整数都不超过100000。
输出格式:
每组数据一行,包括一个正整数,表示做少需要的糖果数。


答题说明:
输入样例
3
1
2
2
输出样例:
4
我的代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct one
{
int rating;
int candy;
}ONE;
int main()
{
int n,i,sum=0;
ONE *ratings,*t,*p;
scanf("%d",&n);
if((ratings=(ONE *)malloc(sizeof(ONE)*n))==NULL)
{
exit(0);
}
t=ratings;
p=ratings;
while(n--)
{
scanf("%d",&(ratings->rating));
ratings++;
}
ratings->rating=-1;
/**在第一个rating比第二个大的时候保证条件成立*/
if(t->rating>(t+1)->rating)
{
t->candy=2;
}
else
{
t->candy=1;
}
for(i=0;;i++)
{
if((t+i)->rating<(t+i+1)->rating)
{
(t+i+1)->candy=(t+i)->candy+1;
}
else
{
(t+i+1)->candy=1;
}
sum+=(t+i)->candy;
if((t+i+1)->rating==-1)
{
break;
}
}
free(ratings);
printf("%ld\n",sum);
return 0;
}

不知道那里错了,编译可以过去,有的时候可以用,但是很多时候在我的电脑上会死机,能不能帮我解释下。

第二个是非常简单的小女孩数数问题


一个小女孩正在用左手手指数数,从1数到n。她从拇指算作1开始数起,然后,食指为2,中指为3,无名指为4,小指为5。接下来调转方向,无名指算作6,中指为7,食指为8,大拇指为9,如此反复。问最后会停在那个手指上?用编号1、2、3、4、5依次表示大拇指、食指、中指、无名指、小指。 输入格式: 输入多组数据。每组数据占一行,只包含一个整数n(1<=n<=1000000000)。 输出格式: 每组数据占一行,只包含一个介于1和5之间的整数,表示最后停留的手指。


我的代码是:
#include<stdio.h>
int main()
{
long n,i=0,flag=0;
while(scanf("%ld",&n)!=EOF)
{
while(n--)
{
if(flag==0)
i++;
if(flag==1)
i--;
if(i==5)
flag=1;
if(i==1)
flag=0;

}
printf("%d\n",i);
i=0;
}
}


第一次提交我用的数据类型是int,但是出错了,是不是因为数据溢出造成的,第二次我换成了现在的long,还是不行,说时间太长,第三次我找了下规律提交下面的代码,貌似还是不对,这是为什么,本地测试没有问题的。
#include<stdio.h>
int main()
{
long n,i=0,flag=0;
while(scanf("%ld",&n)!=EOF)
{
if(n%8==0)
n=2;
else
n=n%8;
while(n--)
{
if(flag==0)
i++;
if(flag==1)
i--;
if(i==5)
flag=1;
if(i==1)
flag=0;

}
printf("%d\n",i);
i=0;
}
return 0;
}
希望各位大神,尤其是参加过这类比赛的大神能够指导下,让我明白点,因为我明年想参加蓝桥杯,我不是学计算机的,所以要努力了



...全文
185 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小白yige 2014-11-05
  • 打赏
  • 举报
回复
感谢各位的热心帮助,我知道基础差,不足可以补,但是不会放弃,现在下结论也太早,以后会努力补的。
小白yige 2014-11-05
  • 打赏
  • 举报
回复
引用 5 楼 nice_cxf 的回复:
都不忍心看你的答案了,你还是放弃参加比赛的想法吧,数学基础太差了
感谢提醒,我知道自己基础确实有点差,关键是也没有其他事情做,我不是计算机专业的,唯一学过的也就是C语言,时间还长,这么匆匆下结论对我也为时过早。感谢,以后我会努力的。
有点清眸 2014-11-05
  • 打赏
  • 举报
回复
引用 4 楼 Falleyes 的回复:
第二题我刚挑战成功,按照数据大小来说,int型是完全够的。 你的代码有点繁琐,那个就是个数字问题,很简单的。多列几行数据,观察,尝试,得出个计算公式,就万事OK啦!
#include <stdio.h>

int main() {
    int n,row,num;
    while(scanf("%d",&n)!=EOF){
        row=(n-2)/4+1;
        num=(n-2)%4+1;
        if(row%2==0)
            num=5-num;
        else
            ++num;
        printf("%d\n",num);
    }
}
唯一有个问题就是,当n = 1时,n - 2会为负数。这个要特殊处理一下。
有点清眸 2014-11-05
  • 打赏
  • 举报
回复
引用 4 楼 Falleyes 的回复:
第二题我刚挑战成功,按照数据大小来说,int型是完全够的。 你的代码有点繁琐,那个就是个数字问题,很简单的。多列几行数据,观察,尝试,得出个计算公式,就万事OK啦!
#include <stdio.h>

int main() {
    int n,row,num;
    while(scanf("%d",&n)!=EOF){
        row=(n-2)/4+1;
        num=(n-2)%4+1;
        if(row%2==0)
            num=5-num;
        else
            ++num;
        printf("%d\n",num);
    }
}
正解!
QIUSQJF 2014-11-05
  • 打赏
  • 举报
回复
第一题在for循环中指针会越界,还有free的指针不对!看着题目太长,而且以前也有一样的问题,你自己搜下吧……第二题,仅供参考
#include<stdio.h>
#include<stdlib.h>

int arry[] = {1, 2, 3, 4, 5, 4, 3, 2};
int main()
{
    long n;
    while(scanf("%ld",&n)!=EOF)
    {
    	printf("%d\n",arry[(n-1) % 8]);    
	}            
    return 0;
}
longburulin 2014-11-05
  • 打赏
  • 举报
回复
如果没必要是可以给一样多的话 我们可以找出遍历数组序列,找出每个递减子序列然后分别给他们值 比如5 3 2 2 1 1我们可以给他们值为4 3 2 2 1 1然后再求和 如果不能给一样多的话 就只能 6 5 4 3 2 1了 这样应该能得到你要的结果
longburulin 2014-11-05
  • 打赏
  • 举报
回复
引用 3 楼 a158337 的回复:
[quote=引用 2 楼 longburulin 的回复:] 第一题不就是先把第一个人的糖果为1 如果后者rating大于前者就为2 如果小于等于 第二个人的糖果就为1 如此递推 假设前者的糖果为a 如果后者rating大于前者就为a+1 如果小于等于 糖果就为1 然后求和 不是这样的么
我感觉没有这么简单,首先没有告诉你一共多少个人,或者不超过多少个人,我就用了动态内存申请,但是不知道为什么有的时候运行不出错。有的时候会出错,第一个人不一定是1,如果第二个人的rating值比第一个人小,那么为了保证那个规则。第一个人最少分两个糖果。[/quote] 恩 刚才没看清题意 首先 你在参加编程的时候 建议你学完STL库吧 当你学完它就基本上可以避免指针操作了 也不用动态申请数字了 用vector容器就可以了 然后至于第一题 还是没有完全理解 你说的没必要一样多是什么意思 可以给一样多么 还是不能给一样多?
Falleyes 2014-11-05
  • 打赏
  • 举报
回复
除了第一行是5个数,后面的每行都是4个数,根据行数的奇偶性来确定是正着还是反着排序的。 抓住这个规则,就剩下确定一些个具体的参数。
nice_cxf 2014-11-05
  • 打赏
  • 举报
回复
都不忍心看你的答案了,你还是放弃参加比赛的想法吧,数学基础太差了
Falleyes 2014-11-05
  • 打赏
  • 举报
回复
第二题我刚挑战成功,按照数据大小来说,int型是完全够的。 你的代码有点繁琐,那个就是个数字问题,很简单的。多列几行数据,观察,尝试,得出个计算公式,就万事OK啦!
#include <stdio.h>

int main() {
    int n,row,num;
    while(scanf("%d",&n)!=EOF){
        row=(n-2)/4+1;
        num=(n-2)%4+1;
        if(row%2==0)
            num=5-num;
        else
            ++num;
        printf("%d\n",num);
    }
}
小白yige 2014-11-05
  • 打赏
  • 举报
回复
引用 2 楼 longburulin 的回复:
第一题不就是先把第一个人的糖果为1 如果后者rating大于前者就为2 如果小于等于 第二个人的糖果就为1 如此递推 假设前者的糖果为a 如果后者rating大于前者就为a+1 如果小于等于 糖果就为1 然后求和 不是这样的么
我感觉没有这么简单,首先没有告诉你一共多少个人,或者不超过多少个人,我就用了动态内存申请,但是不知道为什么有的时候运行不出错。有的时候会出错,第一个人不一定是1,如果第二个人的rating值比第一个人小,那么为了保证那个规则。第一个人最少分两个糖果。
longburulin 2014-11-05
  • 打赏
  • 举报
回复
第一题不就是先把第一个人的糖果为1 如果后者rating大于前者就为2 如果小于等于 第二个人的糖果就为1 如此递推 假设前者的糖果为a 如果后者rating大于前者就为a+1 如果小于等于 糖果就为1 然后求和 不是这样的么
longburulin 2014-11-05
  • 打赏
  • 举报
回复
第二道题目意思是这样的么 当我输入11 输出1 当我输入16 输入5么 如果是我理解的那意思 就没必要那么做了 直接m=n%10 然后如果m>5 输出11-m 如果m<=5 输出m就可以了

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧