学习编程中的Ben 发表于 2023-8-13 15:53:26

小粉兔的元素反应

# 202308H 小粉兔的元素反应

## 题目描述

在小粉兔所处的 Tivat(蒂瓦特)世界,有 $n$ 种元素。其中每种元素都可以蕴含一定的能量,且不同元素之间可以进行反应。

小粉兔现在掌握了这 $n$ 种元素。初始时,他所掌握的每种元素所蕴含的能量依次为 $a _ 1, a _ 2, \cdots, a _ n$。

不同元素之间的反应相关细节如下:

**反应条件**:对于任意两种元素 $i, j$($i \neq j$),如果 $a _ i \times a _ j$ 是 $154$ 的倍数或 $147$ 的倍数,则二者可以进行反应。**元素不可与自身反应**。
**反应结果**:包含这两种元素在内,所有的 $n$ 种元素所蕴含的能量均翻倍(即,所有 $a _ i$ 均变为原来的两倍)。
**反应次数**:任意两种元素之间的反应次数均没有限制(即,同两种元素,在一直符合反应条件的情况下,可以反应多次)。

现在,小粉兔想要通过元素反应,使得自己手头的元素能量总和大于等于 $k$,从而打败 Tivat 世界最强大的怪兽——地文(Devil)。他现在想要知道,通过若干次($0$ 次亦可)反应后,$a _ 1 + a _ 2 + \cdots + a _ n$ 是否可以大于等于 $k$。

## 输入格式

**本题单个测试点内有多组数据**。

输入共 $2 \times T + 1$ 行。

第一行一个整数 $T$,表示数据组数。

对于每组数据:
第一行为两个整数 $n, k$,分别代表元素种类数和小粉兔的目标。
第二行为 $n$ 个整数 $a _ 1, a _ 2, \cdots, a _ n$,分别代表每种元素初始时所蕴含的能量值。

## 输出格式

输出共 $T$ 行。

对于每组数据:
输出一行一个字符串。如果小粉兔可以通过若干次($0$ 次亦可)反应,使得 $a _ 1 + a _ 2 + \cdots + a _ n$ 大于等于 $k$,则输出一行 `Yes`,否则输出 `No`。

## 样例 #1

### 样例输入 #1

```
1
4 1395
143 238 174 199
```

### 样例输出 #1

```
Yes
```

## 样例 #2

### 样例输入 #2

```
1
4 1441
677 293 859 751
```

### 样例输出 #2

```
Yes
```

## 样例 #3

### 样例输入 #3

```
1
4 1295
136 875 196 34
```

### 样例输出 #3

```
No
```

## 提示

### 样例 1 解释

首先,小粉兔可以选择 $143$ 与 $238$ 做乘法,结果为 $143 \times 238 = 34034 = 154 \times 221$。此时所有元素能量翻倍,变为 $286, 476, 348, 398$,而 $286 + 476 + 348 + 398 = 1508 \geq 1395$,因此小粉兔可以通过一次操作达到目的。

### 样例 2 解释

$677 + 293 + 859 + 751 = 2580 \geq 1441$,因此小粉兔不操作便可达到目的。

### 样例 3 解释

小粉兔无法引发任何元素反应,最终四能量相加 $< 1295$,因此小粉兔不可以达到目的。

### 数据规模与约定

设 $N = \sum n$,代表单个测试点内所有测试数据的 $n$ 的总和。设 $K$ 代表单个测试点内所有测试数据的 $k$ 的长度总和。

对于 $100\%$ 的数据,保证 $1 \leq T \leq 10 ^ 5$,$1 \leq n, N \leq 10 ^ 6$,$1 \leq k \leq 10 ^ {10 ^ 5}$,$1 \leq a _ i \leq 10 ^ 9$,$1 \leq K \leq 2 \times 10 ^ 6$。


| 测试点编号 | $n$ | $k$ | $a _ i$ |
| :----------: | :----------: | :----------: | :----------: |
| $1$ | $= 1$ | $\leq 10 ^ 9$ | $\leq 10 ^ 9$ |
| $2 \sim 3$ | $\leq 100$ | $\leq 10 ^ {9}$ | $\leq 10 ^ 5$ |
| $4$ | $\leq 1000$ | $\leq 10 ^ {9}$ | $\leq 13$ |
| $5$ | $\leq 1000$ | $\leq 10 ^ {18}$ | $\leq 10 ^ 9$ |
| $6 \sim 7$ | $\leq 1000$ | $\leq 10 ^ {10 ^ 5}$ | $\leq 10 ^ 9$ |
| $8 \sim 10$ | $\leq 10 ^ 6$ | $\leq 10 ^ {10 ^ 5}$ | $\leq 10 ^ 9$ |



我的代码不对:
T = int(input())
for _ in range(T):
    t = 1
    n, k = map(int, input().split())
    a = list(map(int, input().split()))
    sum_a = sum(a)
    if sum_a > k:
      print("Yes")
      continue
    for i in range(0, len(a)):
      for j in range(i + 1, len(a)):
            if a * a % 154 == 0 or a * a % 147 == 0:
                print("Yes")
                t = 0
                break
      else:
            break
    if t:
      print("No")

isdkz 发表于 2023-8-13 15:53:48

你的代码有一些问题。首先,在判断小粉兔是否可以通过若干次反应达到目标能量之前,你需要先进行一次初始能量的判断。如果初始能量已经大于等于目标能量,那么小粉兔不需要进行任何反应即可达到目标。所以你需要在判断反应之前加上一个判断条件:

if sum_a >= k:
    print("Yes")
    continue


另外,你的双重循环用于遍历所有可能的元素对进行反应,但是你没有更新元素的能量。根据题目要求,每次反应后所有元素的能量都会翻倍,所以你需要在进行反应之后更新元素的能量:

if a[ i] * a % 154 == 0 or a[ i] * a % 147 == 0:
    a[ i] *= 2
    a *= 2


最后,你需要在所有反应结束后再次判断小粉兔的总能量是否大于等于目标能量,并输出结果:

if sum(a) >= k:
    print("Yes")
else:
    print("No")


综合起来,你的代码应该修改为:

T = int(input())
for _ in range(T):
    t = 1
    n, k = map(int, input().split())
    a = list(map(int, input().split()))
    sum_a = sum(a)
    if sum_a >= k:
      print("Yes")
      continue
    for i in range(0, len(a)):
      for j in range(i + 1, len(a)):
            if a[ i] * a % 154 == 0 or a[ i] * a % 147 == 0:
                a[ i] *= 2
                a *= 2
    if sum(a) >= k:
      print("Yes")
    else:
      print("No")


希望对你有帮助!

陶远航 发表于 2023-8-13 15:54:10

你的代码有一些问题。首先,在每个组中判断是否存在元素可以反应时,你只是在找到一对可以反应的元素后就输出"Yes"。但是实际上,在反应过程中,元素的能量会不断增加,所以你需要在找到每对可以反应的元素后更新元素的能量值。

另外,你在每个组中的循环中使用了变量"t"来表示是否找到了可以反应的元素对。但是你在内层循环中直接将"t"赋值为0,并没有考虑外层循环的影响。所以每次都会输出"No"。

下面是修改后的代码:

T = int(input())

for _ in range(T):
    n, k = map(int, input().split())
    a = list(map(int, input().split()))
    sum_a = sum(a)
   
    if sum_a >= k:
      print("Yes")
      continue
   
    found = False
   
    for i in range(n):
      for j in range(i + 1, n):
            if a[ i] * a % 154 == 0 or a[ i] * a % 147 == 0:
                a[ i] *= 2
                a *= 2
                sum_a = sum(a)
                if sum_a >= k:
                  found = True
                  break
      if found:
            break
            
    if found:
      print("Yes")
    else:
      print("No")


这样,你的代码就能正确输出结果了。
如果问题已经解决,请设置最佳答案

高山 发表于 2023-8-13 16:25:32

你咋那么喜欢管理员小粉兔

sfqxx 发表于 2023-9-3 11:42:49

高山 发表于 2023-8-13 16:25
你咋那么喜欢管理员小粉兔

不是,本次入门赛主角是他
页: [1]
查看完整版本: 小粉兔的元素反应