hdu 1234

开门人和关门人

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8880    Accepted Submission(s): 4607


Problem Description
每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签
到、签离记录,请根据记录找出当天开门和关门的人。
 

 

Input
测试输入的第一行给出记录的总天数N ( > 0 )。下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为

证件号码 签到时间 签离时间

其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
 

 

Output
对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
 

 

Sample Input
3
1
ME3021112225321 00:00:00 23:59:59
2
EE301218 08:05:35 20:56:35
MA301134 12:35:45 21:40:42
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40
 

 

Sample Output
ME3021112225321 ME3021112225321
EE301218 MA301134
SC3021234 CS301133
 

 

Source
代码:

#include "stdio.h"
#include "malloc.h"
#include "string.h"

int main()
{  int n;
int k,r;
int i;
int m;
char (*a)[16],(*b)[10],(*c)[10];
char ma[10],mi[10];
   scanf("%d",&m);
   while(m--)
  { scanf("%d",&n);
    a=(char (*)[16])malloc(sizeof(char)*n*16);    //申请动态的二维数组
   b=(char (*)[10])malloc(sizeof(char)*n*10);
   c=(char (*)[10])malloc(sizeof(char)*n*10);
   k=0;     //注意:k和r一定要赋初值
   r=0;
   for(i=0;i<n;i++)
    {scanf("%s",a[i]);
    scanf("%s",b[i]);
    scanf("%s",c[i]);
    }
    strcpy(ma,b[0]);
     strcpy(mi,c[0]);
     for(i=0;i<n;i++)
      {if(strcmp(ma,b[i])>0)
      {strcpy(ma,b[i]);
      k=i;
      }
      }
     for(i=0;i<n;i++)
      {if(strcmp(mi,c[i])<0)
      {strcpy(mi,c[i]);
      r=i;
      }
      }
      printf("%s ",a[k]);
      printf("%s",a[r]);
      printf("\n");
      free(a);    //最后申请完动态数组后一定要释放
      free(b);
      free(c);
     
      }
      return 0;
}

 

动态数组如何申请:

一维数组的申请: 

#include <stdio.h>
#include <malloc.h>
int main(){
int n;
scanf(“%d”, &n);
double *shzu
= (double *) malloc(sizeof(double) * n);
… …
free(shuzu);
return 0;
}
 
以poj1047 走路与骑车

2703:骑车与走路

总时间限制:
1000ms
内存限制:
65536kB
描述
在北大校园里,没有自行车,上课办事会很不方便.但实际上,并非去办任何事情都是骑车快,因为骑车总要找车、开锁、停车、锁车等,这要耽误一些时间.假设找到自行车,开锁并车上自行车的时间为27秒;停车锁车的时间为23秒;步行每秒行走1.2米,骑车每秒行走3.0米.请判断走不同的距离去办事,是骑车快还是走路快.
输入
第一行为待处理的数据的数量n
其后每一行整数为一次办事要行走的距离,单位为米.
输出
对应每个整数,如果骑车快,输出一行"Bike";如果走路快,输出一行"Walk";如果一样快,输出一行"All".
样例输入
4
50
90
120
180
样例输出
Walk
Walk
Bike
Bike



思路:由于n没有上限,故这里采用一维动态数组:
这是假定 n=10  
#include <stdio.h>                    用完动态数组后是这样:  
#define N 10                                                     
void compute(int distance);
int main(){
int n;
int distance[N];
int i;
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &(distance[i]));
}
 
for(i = 0; i < n; i++){
compute(distance[i]);
}
return 0;
}
  
void compute(int distance){
 
int timeBike = 27 + 23 + distance/3;
 
int timeWalk = (int)(distance/1.2);
 
if(timeBike < timeWalk){
printf("Bike\n");
} else if (timeBike > timeWalk){
printf("Walk\n");
} else {
printf("All\n");
}
 
}
  用完动态数组后是这样:  
 

#include <stdio.h>

#include <malloc.h>     //

void compute(int distance);

int main(){

int n;

int i;

scanf("%d", &n);

int *distance = (int *) malloc(sizeof(int)*n);  //

for(i = 0; i < n; i++){

scanf("%d", &(distance[i]));

}

 

for(i = 0; i < n; i++){

compute(distance[i]);

}

free(distance);

return 0;

}

#include "stdio.h"
#include "malloc.h"
int main()
{ int i,j,k;
  int n;
   void compete(int x);
  scanf("%d",&n);
  int *a=(int *)malloc(sizeof(int)*n);
  for(i=0;i<n;i++)
    {scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
     {compete(a[i]);
     }
   
     return 0;
    
  }
  void compete(int x)
   {int k,m;
    k=27+23+x/3;
    m=(int)(x/1.2);
    if(k<m)
    printf("Bike\n");
    if(k>m)
    printf("Walk\n");
    if(k==m)
    printf("All\n");
    }方法e二:

#include "stdio.h"
#include "malloc.h"
int main()
{ int i,j,k;
  int n;
   void compete(int x);
  scanf("%d",&n);
  int *a=(int *)malloc(sizeof(int)*n);
  for(i=0;i<n;i++)
    {scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
     {compete(a[i]);
     } return 0;
    
  }
  void compete(int x)
   {double k,m;
    k=27+23+x/3.0;
    m=x/1.2;
    if(k<m)
    printf("Bike\n");
    if(k>m)
    printf("Walk\n");
    if(k==m)
    printf("All\n");
    }

 

注意这俩种方法的不同在于compete函数中int 与 double 的区别,原因是:第一种k的表达式中除的是3.我们知道在c语言中整数除以整数还是整数,故要将 m=(int)(x/1.2);转换成int型。同理也可已解释为什么改成double也可以了      呵呵

 二维数组


使用的时候就和一般的二维数组一样。
举个例子给你:
#include "stdlib.h"
#include "stdio.h"
#include <malloc.h>

int main()
{
int i,j;
int n;//这个就是需要指定的行数
int (*p)[10];

scanf("%d",&n);//取得行数

//动态生成二维数组,指定列数为10,如果想改,自己该里面
的参数,如果想定义n行2列就为: p=(int (*)[2])malloc(n*2*sizeof(int));
p=(int (*)[10])malloc(n*10*sizeof(int)); //动态申请n行10列的二维数组

for(i=0;i<n;i++)
for(j=0;j<10;j++)
p[i][j]=i*j;

for(i=0;i<n;i++)
{
for(j=0;j<10;j++)
printf("%d,",p[i][j]);

printf("\n");
}
free(p);

return 0;
}

 
posted on 2013-07-29 18:11  守护生命的绿荷  阅读(344)  评论(0编辑  收藏  举报