CCF201809-2:买菜(C语言) 100分答案

CCF201809-2:买菜(C语言)

100分答案

题目

问题描述

小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车。具体的,对于小H来说有n个不相交的时间段[a1,b1],[a2,b2]…[an,bn]在装车,对于小W来说有n个不相交的时间段[c1,d1],[c2,d2]…[cn,dn]在装车。其中,一个时间段[s, t]表示的是从时刻s到时刻t这段时间,时长为t-s。
  由于他们是好朋友,他们都在广场上装车的时候会聊天,他们想知道他们可以聊多长时间。

输入格式

输入的第一行包含一个正整数n,表示时间段的数量。
  接下来n行每行两个数ai,bi,描述小H的各个装车的时间段。
  接下来n行每行两个数ci,di,描述小W的各个装车的时间段。

输出格式

输出一行,一个正整数,表示两人可以聊多长时间。

样例输入

4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14

样例输出

3

数据规模和约定

对于所有的评测用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,对于所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。

思路:

题目分析:

这压根就和买菜没一毛钱关系(吐槽一下)
就是给两个人的时间段,计算这两个人时间段的重合时间,即两个甘特图求重合时间。
注意:题目的[a1,b1],[a2,b2]中的a1,b1,a2,b2指的是时刻,而不是时间,也就是:
CCF201809-2:买菜(C语言) 100分答案_第1张图片
则:
小H与小W一人一个数组,初始化都为false,在时间段内则染色成为true;最后统计小H与小W数组中都为true的格子数(一个格子代表1s),即为总重合数(也就是小H与小W的聊天时间)

代码

#include 
#include 
#include 

//染色由false染成true,将arr数组的第a个“|线”到第b个“|线”内的格子置为true 
void colour(bool arr[],unsigned long int a,unsigned long int b){
	unsigned long int i = 0;
	for(i=a;i<b;i++){
		arr[i]=true;
	}
}

int main(int argc, char *argv[]) {
	bool H[1000000];//设置小H数组 
	bool W[1000000];//设置小W数组 
	unsigned long int i = 0;
	for(i=0;i<1000000;i++){//初始化为false 
		H[i]=false;
		W[i]=false;
	}
	unsigned long int n = 0;
	unsigned long int a = 0;
	unsigned long int b = 0;
	unsigned long int c = 0;
	unsigned long int d = 0;
	scanf("%ld",&n);
	for(i=0;i<n;i++){
		scanf("%ld %ld",&a,&b);
		colour(H,a,b);//小H数组染色 
	} 
	for(i=0;i<n;i++){//小W数组染色 
		scanf("%ld %ld",&c,&d);
		colour(W,c,d);
	}
	unsigned long int count = 0;
	for(i=0;i<1000000;i++){//统计同为true的数组格子数 
		if(H[i]&&W[i]){
			count++;
		}
	}
	printf("%ld",count);//输出 
	return 0;
}

评测结果

提交时间:02-19 15:12 (2019年)
代码长度:780B
编程语言:C
评测结果:正确
得分: 100
时间使用:15ms
空间使用:2.292MB

心得体会

一、函数创建时的参数中的数组参数声明方式,有如下3种,是等价的:

  1. 形参为一个已知长度的数组
void function(int arr[10]){
	...
}
  1. 形参为一个未知长度的数组(通常把长度也作为参数传递过去)
void function(int arr[],int length){
	...
}
  1. 形参为一个指针
void function(int *arr[]){
	...
}

二、将数组传递给函数:

int arr[3]={0,1,2};//养成初始化的好习惯
function(arr);

直接传数组名即可,在C语言中实际上,数组名就是一个指向此数组的第一个元素的指针,即:
arr 等价于&(arr[0])
*arr 等价于 arr[0]

延申:
所以才有 从string中取数字的如下操作:
比如:134haha289nihao3
取出为:1342893

void stringToInt(char *str,int *num){
	int value = 0;
	char *p = str;
	while(*p!='\0'){
		if(*p>='0'&&*p<='9'){
			value = value*10+(*p-'0');
		}
		p++;
	}
	*num = vlaue;
}

你可能感兴趣的:(心路历程)