hdu 1234
开门人和关门人
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8880 Accepted Submission(s): 4607
到、签离记录,请根据记录找出当天开门和关门的人。
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为
证件号码 签到时间 签离时间
其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
#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("
");
free(a); //最后申请完动态数组后一定要释放
free(b);
free(c);
}
return 0;
}
动态数组如何申请:
一维数组的申请:
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 10void 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 ");} else if (timeBike > timeWalk){printf("Walk ");} else {printf("All ");}}用完动态数组后是这样:#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 ");
if(k>m)
printf("Walk ");
if(k==m)
printf("All ");
}方法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 ");
if(k>m)
printf("Walk ");
if(k==m)
printf("All ");
}注意这俩种方法的不同在于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(" ");
}
free(p);
return 0;
}