CCF-CSP认证 历年题目自练 Day5

CCF-CSP认证 历年题目自练 Day5

第一题

试题编号: 201409-1
试题名称: 相邻数对
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。
输入格式
  输入的第一行包含一个整数n,表示给定整数的个数。
  第二行包含所给定的n个整数。
输出格式
  输出一个整数,表示值正好相差1的数对的个数。
样例输入
6
10 2 6 3 7 8
样例输出
3
样例说明
  值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。
评测用例规模与约定
  1<=n<=1000,给定的整数为不超过10000的非负整数。

题目分析(自己理解):

  1. 问题描述
      给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。(太简单,大家都懂啥意思)也就是找出差一的整数对。
  2. 看输入:输入的第一行包含一个整数n,表示给定整数的个数。我直接n=int(input)
  3. 第二行看条件,多个整数且用空格分开,都快条件反射了,直接m=list(map(int,input().split()))此时,m=[10,2,6,3,7,8]
  4. 关于差一的判断,我的思想是先将元素按升序排序,然后从位序为一开始两两比较,如果m[i]+1==m[i+1]则是一对,这样升序排序后就不用考虑-1的问题了。那我用内置函数sorted()直接对列表中的元素进行升序排序。(如果有空可以看看sorted()源代码,看看是什么样算法排序,插入?快速?不知道。。。)
  5. 输出多少对,直接加一个计数器num=0,num+=1结束!
  6. 上代码:
n=int(input())
m=sorted(list(map(int,input().split())))
num = 0

for i in range(n-1):
    if m[i]+1==m[i+1]:
        num+=1
print(num)

再来一题

试题编号: 201409-2
试题名称: 画图
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
  下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。
CCF-CSP认证 历年题目自练 Day5_第1张图片

给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。
输入格式
  输入的第一行包含一个整数n,表示要画的矩形的个数。
  接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。
输出格式
  输出一个整数,表示有多少个单位的面积被涂上颜色。
样例输入
2
1 1 4 4
2 3 6 5
样例输出
15
评测用例规模与约定
  1<=n<=100,0<=横坐标、纵坐标<=100。

题目分析(自己理解):

  1. 这道题一看图就想到了前面我曾今做过的窗口那道题,第一行输入指定要用for循环建造n个矩形。n=int(input()) for i in range(n):
  2. 输入n个m 还是选择列表做容器 m=list(map(int,input().split()))输入的四个分别是x1,y1x2,y2
  3. 现在问题来了,如何把矩形上色呢?先看一下评测用例规模与约定,也就是说我要在100*100那么大的坐标系上画多个矩形(上色),当然上过色的区域后面的矩形就不用再上色了。再看输出格式输出一个整数,表示有多少个单位的面积被涂上颜色。可以把每个单元的默认值理解为0,上过色的将单元格的值设置为1。最后只要输出单元格为1,的个数即可。
  4. 矩形的单元格我咋知道在哪?用什么表示?不知道在哪咋变成1?这里单元格要满足两个条件,既能存位置又能存值(0或1)我选择列表。将坐标轴上的每一个单元格标号(列表位序)列表的元素的值代表是否上色。
  5. 比如输入1 回车 2 1 5 3 就是下图:
    接下来通过横纵坐标确定矩形所有的单元格位序然后将这些单元格的值赋值为1即可。
    m=list(map(int,input().split()))
    for j in range(m[0],m[2]):#横坐标
        for k in range(m[1],m[3]):#纵坐标
            l[j*100+k]=1#第一次遍历的单元格是所画矩形左下角的单元格,并将值赋为1

CCF-CSP认证 历年题目自练 Day5_第2张图片此时,l[[102] l[103] l[104] l[202] l[203] l[204] 的值都是1。

  1. 如何创建一个100*100的画布呢?使用列表l=[]代表画布,设置位序为 0 到 100 * 100 。for i in range(100 * 100) 如何将初始的列表中每一个元素设为0呢?l+=[0]就OK了。# 画布规定了有多少个单元格就有多少个0。
  2. 再用一个a统计是1的单元格数目。(int)型。单元格是1就a+1。
  3. 完整代码如下:
n=int(input())
l=[]
for i in range(100*100):#初始化坐标系
    l+=[0]#设置每一个单元格的值是0
for i in range(n):
    m=list(map(int,input().split()))
    for j in range(m[0],m[2]):#横坐标
        for k in range(m[1],m[3]):#纵坐标
            l[j*100+k]=1#该点为所画方块左下角点
a=0
for i in range(100*100):
    if l[i]==1:
        a+=1
print(a)


总结

今天的练习终于感觉轻松一些了。只有多练才能有编程思维,不练就没感觉了。

此次三张照片由本人大学阶段(目前)遇到的最好的老师之一(Ms.Li)提供。
CCF-CSP认证 历年题目自练 Day5_第3张图片
CCF-CSP认证 历年题目自练 Day5_第4张图片
CCF-CSP认证 历年题目自练 Day5_第5张图片

你可能感兴趣的:(算法,数据结构,python,学习)