solution.md 2.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
# 倍数问题
####  题目描述
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

#### 输入格式
从标准输入读入数据。
第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。

#### 输出格式
输出到标准输出。
输出一行一个整数代表所求的和。

#### 样例输入
```
4 3
1 2 3 4
```

#### 样例输出
```
9
```

#### 样例解释
```
选择2、3、4。
```

## aop
### before
```cpp
#include <bits/stdc++.h>
#include <string>
#include <queue>
#include <set>
#include <cstring>
#include <cmath>
#include <algorithm>
#define MAX 1000000000
using namespace std;
int n, k, a[100010];
int b[4];
int flag = 0;
```
### after
```cpp
int main()
{
	cin >> n >> k;
	a[0] = MAX;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	sort(a + 1, a + n + 1);
	reverse(a + 1, a + n + 1);
	dfs(a, n, 1);
	return 0;
}
```

## 答案
```cpp
void dfs(int a[], int n, int s)
{
	if (flag == 1)
		return;
	if (s == 4)
	{
		int sum = b[1] + b[2] + b[3];
		if (sum % k == 0)
		{
			flag = 1;
			cout << sum << endl;
		}
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (a[i] < a[s - 1])
		{
			b[s] = a[i];
			dfs(a, n, s + 1);
		}
	}
}
```
## 选项

### A
```cpp
void dfs(int a[], int n, int s)
{
	if (flag == 1)
		return;
	if (s == 4)
	{
		int sum = b[1] + b[2] + b[3];
		if (sum % k == 0)
		{
			flag = 1;
			cout << sum << endl;
		}
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (a[i] < a[s - 1])
		{
			b[s] = a[i];
			dfs(a, n, s);
		}
	}
}
```

### B
```cpp
void dfs(int a[], int n, int s)
{
	if (flag == 1)
		return;
	if (s == 4)
	{
		int sum = b[1] + b[2] + b[3];
		if (sum % k == 0)
		{
			flag = 1;
			cout << sum << endl;
		}
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (a[i] < a[s + 1])
		{
			b[s] = a[i];
			dfs(a, n, s + 1);
		}
	}
}
```

### C
```cpp
void dfs(int a[], int n, int s)
{
	if (flag == 1)
		return;
	if (s == 4)
	{
		int sum = b[1] + b[2] + b[3];
		if (sum % k == 0)
		{
			flag = 1;
			cout << sum << endl;
		}
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (a[i] < a[s + 1])
		{
			b[s] = a[i];
			dfs(a, n, s);
		}
	}
}
```