蓝桥刷题——数组

1、开灯

## 题目描述

在一条无限长的路上,有一排无限长的路灯,编号为 $1,2,3,4,\dots$。

每一盏灯只有两种可能的状态,开或者关。如果按一下某一盏灯的开关,那么这盏灯的状态将发生改变。如果原来是开,将变成关。如果原来是关,将变成开。

在刚开始的时候,所有的灯都是关的。小明每次可以进行如下的操作:

指定两个数,$a,t$($a$ 为实数,$t$ 为正整数)。将编号为 $\lfloor a\rfloor,\lfloor 2 \times a\rfloor,\lfloor3 \times a\rfloor,\dots,\lfloor t \times a\rfloor$ 的灯的开关各按一次。其中 $\lfloor k \rfloor$ 表示实数 $k$ 的整数部分。

在小明进行了 $n$ 次操作后,小明突然发现,这个时候只有一盏灯是开的,小明很想知道这盏灯的编号,可是这盏灯离小明太远了,小明看不清编号是多少。

幸好,小明还记得之前的 $n$ 次操作。于是小明找到了你,你能帮他计算出这盏开着的灯的编号吗?

## 输入格式

第一行一个正整数 $n$,表示 $n$ 次操作。

接下来有 $n$ 行,每行两个数,$a_i,t_i$。其中 $a_i$ 是实数,小数点后一定有 $6$ 位,$t_i$ 是正整数。

## 输出格式

仅一个正整数,那盏开着的灯的编号。

## 样例 #1

### 样例输入 #1

```

3

1.618034 13

2.618034 7

1.000000 21

```

### 样例输出 #1

```

20

```

## 提示

记 $T=\sum \limits_{i=1}^n = t_1+t_2+t_3+\dots+t_n$。

对于 $30\%$ 的数据,满足 $T \le 1000$;

对于 $80\%$ 的数据,满足 $T \le 200000$;

对于 $100\%$ 的数据,满足 $T \le 2000000$;

对于 $100\%$ 的数据,满足 $n \le 5000,1 \le a_i<1000,1 \le t_i \le T$。

数据保证,在经过 $n$ 次操作后,有且只有一盏灯是开的,不必判错。而且对于所有的 $i$ 来说,$t_i\times a_i$ 的最大值不超过 $2000000$。

题解思路:利用列表标记灯开关,开为1,关为0

n=int(input())

x=[0 for i in range(2000005)]

for j in range(n):
    a,t=map(float,input().split())
    for i in range(1,int(t+1)):
        if x[int(a*i)]==0:
            x[int(a*i)]=1
        else:x[int(a*i)]=0

for i in range(1,2000005):
    if x[i]==1:
        print(i)
        break
    
    
            

2、 【深基5.习6】蛇形方阵

## 题目描述

给出一个不大于 $9$ 的正整数 $n$,输出 $n\times n$

的蛇形方阵。

从左上角填上 $1$ 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 $3$ 个字符,前面使用空格补齐。

## 输入格式

输入一个正整数 $n$,含义如题所述。

## 输出格式

输出符合题目要求的蛇形矩阵。

## 样例 #1

### 样例输入 #1

```

4

```

### 样例输出 #1

```

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

```

## 提示

数据保证,$1 \leq n \leq 9$。

题解思路:找出行走的规律一共四种走法(贪吃蛇走法):行+-1,列不变;列+-1,行不变。

把输出整体看成一维矩阵!

n=int(input())
a=[[0 for i in range(15)]for i in range(15)]

pos=[[0,1],[1,0],[0,-1],[-1,0]]#走法

x=1
y=1
d=0
for i in range(1,n*n+1):
    a[x][y]=i
    tx=x+pos[d][0]
    ty=y+pos[d][1]#当前规则的下一步
    #下一步需要转向的五种情况(下一步碰到四个边或者有数)
    if tx<1 or tx>n or ty<1 or ty>n or a[tx][ty]:
        d=(d+1)%4
    x+=pos[d][0]
    y+=pos[d][1]

for i in range(1,n+1):
    for j in range(1,n+1):
''' 输出 法1,用+进行字符串拼接
        if a[i][j]<10:
            print("  "+str(a[i][j]),end='') #一位数要加两空格
        else:
            print(" "+str(a[i][j]),end='')#两位数加一空格
    print()

'''
#法2:利用str.format()填充
        a[i][j]='{:>3}'.format(a[i][j])
        print(a[i][j],end='')
    print()

注:字符串填充的两种方法,推荐法2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值