C语言 洛谷刷题 菜鸟
P2006 赵神牛的游戏
未通过!!!因为运行时间超过了,但是还是先打卡记录,今天写代码先到这里,虽然还没过,但是还有其他作业,今天的代码使用了我比较薄弱的链表,明天好好分析一下为什么时间超时,初步感觉:1.循环的嵌套导致时间的增加,2.链表的使用不知道会不会导致时间的增加??
明日改进代码后,将再次发在此贴后面,再分析原因,先去肝其他作业。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
long int value;
struct node *next;
}Node;
int main()
{
Node *head,*p,*last,*temp;
long int k,m,n;
long int ai,bi;
long int i,j;
long int temp_ai,temp_bi;
head = NULL;
scanf("%ld%ld%ld",&k,&m,&n);
for(i = 1;i <= m;i++)
{
scanf("%ld%ld",&ai,&bi);
p = last = (Node*)malloc(sizeof(Node));
last = head;
if(ai<=k)
{
temp_ai = k/ai;
if((bi*temp_ai) >= n)
{
p->value = i;
p->next = NULL;
if(last!=NULL)
{
while(last->next !=NULL)
{
last = last->next;
}
last->next = p;
}
else
{
head = p;
}
}
}
}
temp = head;
if(head == NULL)
{
printf("-1");
}
else
{
while(temp!=NULL)
{
printf("%ld ",temp->value);
temp = temp->next;
}
}
}
未通过,时间超时
今天一下课马上就来改代码了,首先汲取了一下讨论区里面大家的讨论,发现一个大问题,一般给的测试数据就是输入一大串,输出一大串,我老是想着将每次的输出存在一个数组或者是链表里面最后一起输出,保持和测试数据的格式一致,但是讨论区惊现的代码里面有输入一份数据,输出一个结果的代码,而且是被允许通过的,因为我就修改了我的代码之后,按照这种方式过得。
前面发现运行时间超时,主要是使用了指针存储结果,如果少了这个存储结果,以及循环输出结果的过程,就会大大降低运行的时间,代码也会变得很简单,因为本题也是入门的,本人菜鸟只敢从入门开始打起。
其次,我修改了我的代码之后,发现一个问题,还是通不过,下载了洛谷给的测试数据,发现题目有大坑,就是有的技能有伤害并且不需要体力值的情况没有被考虑到,所以导致结果的没有被通过,最后修改加了一个分支语句进去就通过啦。
下面是正确的代码
#include<stdio.h>
int main()
{
int k,m,n;
int ai,bi;
int i,flag;
int temp_ai;
flag = 0;
scanf("%d%d%d",&k,&m,&n);
for(i = 1;i <= m;i++)
{
scanf("%d%d",&ai,&bi);
if(ai<=k&&ai!=0)
{
temp_ai = k/ai;
if((bi*temp_ai) >= n)
{
flag = 1;
printf("%d ",i);
}
}
else if(ai == 0)
{
flag = 1;
printf("%d ",i);
}
}
if(flag == 0)
{
printf("-1");
}
}
已经通过了