第一题

在商城的某个位置有一个商品列表,该列表是由L1、L2两个子列表拼接而成。当用户浏览并翻页时,需要从列表L1、L2中获取商品进行展示。展示规则如下:

1. 用户可以进行多次翻页,用offset表示用户在之前页面已经浏览的商品数量,比如offset为4,表示用户已经看了4个商品

2. n表示当前页面需要展示的商品数量

3. 展示商品时首先使用列表L1,如果列表L1长度不够,再从列表L2中选取商品

4. 从列表L2中补全商品时,也可能存在数量不足的情况

请根据上述规则,计算列表L1和L2中哪些商品在当前页面被展示了

输入描述:

每个测试输入包含1个测试用例,包含四个整数,分别表示偏移量offset、元素数量n,列表L1的长度l1,列表L2的长度l2。

输出描述:

在一行内输出四个整数分别表示L1和L2的区间start1,end1,start2,end2,每个数字之间有一个空格。 注意,区间段使用半开半闭区间表示,即包含起点,不包含终点。如果某个列表的区间为空,使用[0, 0)表示,如果某个列表被跳过,使用[len, len)表示,len表示列表的长度。

输入例子1:

2 4 4 4 1 2 4 4 4 1 3 3

输出例子1:

2 4 0 2 1 3 0 0 3 3 1 2

我的答案:

import sys
offset, n, l1, l2 = map(int, sys.stdin.readline().strip().split(" "))

if l1+l2-offset <= n: # length not enough
    if offset >= l1+l2:
        # s = [l1, l1, l2, l2]
        s = str(l1) + ' ' + str(l1) + ' ' + str(l2) + ' ' + str(l2)
    elif offset <= l1:
        s = str(offset) + ' ' + str(l1) + ' ' + str(0) + ' ' + str(l2)
    else:
        s = str(l1) + ' ' + str(l1) + ' ' + str(offset) + ' ' + str(l2)
else:
    if offset+n <= l1:  # all new items stored in list 1
        start1 = offset
        end1 = offset+n
        start2 = 0
        end2 = 0
    elif offset >= l1:  # all new items stored in list 2
        start1 = l1
        end1 = l1
        start2 = offset-l1
        end2 = offset-l1+n
    else:  # new items stored in both list 1 and list2
        start1 = offset
        end1 = l1
        start2 = 0
        end2 = n-l1+offset
    s = str(start1)+' '+str(end1)+' '+str(start2)+' '+str(end2)
print(s)

第三题

给出平面上的n个点,现在需要你求出,在这n个点里选3个点能构成一个三角形的方案有几种。
 

输入描述:

第一行包含一个正整数n,表示平面上有n个点(n <= 100) 第2行到第n + 1行,每行有两个整数,表示这个点的x坐标和y坐标。(所有坐标的绝对值小于等于100,且保证所有坐标不同)

输出描述:

输出一个数,表示能构成三角形的方案数。

输入例子1:

4 0 0 0 1 1 0 1 1

输出例子1:

4

例子说明1:

4个点中任意选择3个都能构成三角形

这道题我修改了好几遍……后来发现错在了判断三角形上,而不是排列组合。

给出一个解法:这里用到了链接内给出的,求全组合的办法(见下)。

特别注意判断三角形的地方!!用的是判断三点不共线的条件。尝试用两边之和大于第三边,两边之差小于第三边的方法,一直没法全部通过。

import sys
import math
import copy


def combine(l, n):
    answers = []
    one = [0] * n

    def next_c(li=0, ni=0):
        if ni == n:
            answers.append(copy.copy(one))
            return
        for lj in range(li, len(l)): # python2和python3一个用range,一个用xrange
            one[ni] = l[lj]
            next_c(lj + 1, ni + 1)
    next_c()
    return answers


n = int(sys.stdin.readline().strip())  # read the 1st line
index = []
if n < 3:
    print('Error')
for i in range(n):
    index.append(i)
else:
    x = []
    y = []
    for i in range(n):
        x_new, y_new = map(int, sys.stdin.readline().strip().split(" "))
        x.append(x_new)
        y.append(y_new)
    index = combine(index, 3)
    count = 0
    for i in range(len(index)):
        p0 = index[i][0]
        p1 = index[i][1]
        p2 = index[i][2]
        # a = math.sqrt(pow(x[p0] - x[p1], 2) + pow(y[p0] - y[p1], 2))  # 错误的判断三角形
        # b = math.sqrt(pow(x[p0] - x[p2], 2) + pow(y[p0] - y[p2], 2))
        # c = math.sqrt(pow(x[p1] - x[p2], 2) + pow(y[p1] - y[p2], 2))
        # if a+b>c and abs(a-b)<c and a+c>b and abs(a-c)<b and b+c>a and abs(b-c)<a :
        #     count += 1
        if ((x[p0] - x[p1])*(y[p2] - y[p1])-(x[p2] - x[p1])*(y[p0] - y[p1])) != 0:  # 判断三角形
            count += 1
print(count)

我自己做的时候由于没想到怎么解决全组合的问题,选择使用全排列(也就是说1,2,3和3,2,1是不同的方案),然后在除以3!=6,得到的结果一致。代码如下:

import sys
import math
n = int(sys.stdin.readline().strip())  # read the 1st line
if n < 3:
    print('Error')
else:
    x = []
    y = []
    for i in range(n):
        x_new, y_new = map(int, sys.stdin.readline().strip().split(" "))
        x.append(x_new)
        y.append(y_new)
    c = []
    for i in range(len(x)):  # 去掉重复坐标
        c.append((x[i], y[i]))
    c = list(set(c))
    x = []
    y = []
    for i in range(len(c)):
        x.append(c[i][0])
        y.append(c[i][1])
    count = 0
    for i in range(len(x)):
        for j in range(len(x)):
            if j == i:
                continue
            else:
                for k in range(len(x)):
                    if k == j or k == i:
                        continue
                    else:
                        if ((x[i] - x[j]) * (y[k] - y[j]) - (x[k] - x[j]) * (y[i] - y[j])) != 0:  # 判断三角形
                            count += 1
    count = int(count/6)
    print(count)

最后再给出一个求全组合的第三种方法,依然是来自链接:

from itertools import combinations # 组合函数
print(list(combinations([1,2,3,4,5], 3)))