文章目录
一【题目难度】
- 乙级
二【题目编号】
- 1053 住房空置率 (20 分)
三【题目描述】
- 在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断。判断方法如下:
- 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e e e,则该住房为“可能空置”;
- 若观察期超过某给定阈值 D D D 天,且满足上一个条件,则该住房为“空置”。
- 现给定某居民区的住户用电量数据,请你统计“可能空置”的比率和“空置”比率,即以上两种状态的住房占居民区住房总套数的百分比。
四【题目示例】
-
输入格式:
输入第一行给出正整数 N ( ≤ 1000 ) N(≤1000) N(≤1000),为居民区住房总套数;正实数 e e e,即低电量阈值;正整数 D D D,即观察期阈值。随后 N N N 行,每行按以下格式给出一套住房的用电量数据: K E 1 E 2 . . . E K K E_1 E_2 ... E_K KE1E2...EK
其中 K K K 为观察的天数, E i E_i Ei 为第 i i i 天的用电量。 -
输出格式:
在一行中输出“可能空置”的比率和“空置”比率的百分比值,其间以一个空格分隔,保留小数点后 1 位。 -
输入样例:
5 0.5 10
6 0.3 0.4 0.5 0.2 0.8 0.6
10 0.0 0.1 0.2 0.3 0.0 0.8 0.6 0.7 0.0 0.5
5 0.4 0.3 0.5 0.1 0.7
11 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
11 2 2 2 1 1 0.1 1 0.1 0.1 0.1 0.1 -
输出样例:
40.0% 20.0%
(样例解释:第2、3户为“可能空置”,第4户为“空置”,其他户不是空置。)
五【解题思路】
- 这个题思路很多,我使用二维数组存储每行数据,第一个位置存储观察天数,后面存储记录的数据。然后扫描这个二维数组,按照题目要求记录,最后输出即可,但是有几个坑点需要注意:
①:空置的判断是在可能空置的基础上,如果观察天数超过阈值 D D D,那么就是空置,而不是低于阈值 e e e的天数超过阈值 D D D,这会导致有两个用例无法通过,确实不好好读容易忽略,判断是不是空置先看是不是可能空置,如果是可能空置先算上,如果在此基础上又满足空置,那么可能空置就转换为空置了
②:要用 % % \%\% %%输出 % \% %,而不是转义字符
③:要记得强制类型转换为 f l o a t float float
六【最终得分】
- 20分
七【代码实现】
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N,D;
float e;
scanf("%d %f %d",&N,&e,&D);
float** view = (float**)malloc(N*sizeof(float*));
for(int i = 0;i<N;i++)
{
float day;
scanf("%f",&day);
view[i] = (float*)calloc(day+1,sizeof(float));
view[i][0] = day;
for(int j = 1;j<=day;j++)
{
scanf("%f",&view[i][j]);
}
}
int mayVacant = 0,vacant = 0;
for(int i = 0;i<N;i++)
{
float day = view[i][0];
int count = 0;
for(int j = 1;j<=day;j++)
{
if(view[i][j] < e)
{
count++;
}
}
if(count > (day / 2))
{
mayVacant++;
if(D < day)
{
mayVacant--;
vacant++;
}
}
}
printf("%.1f%% %.1f%%",((float)mayVacant/(float)N)*100,((float)vacant/(float)N)*100);
return 0;
}