solution.md 5.2 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1
# 倍数问题
F
fix bug  
feilong 已提交
2

3
**题目描述**
F
fix bug  
feilong 已提交
4

每日一练社区's avatar
每日一练社区 已提交
5 6
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

7
**输入格式**
F
fix bug  
feilong 已提交
8

每日一练社区's avatar
每日一练社区 已提交
9 10 11 12
从标准输入读入数据。
第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。

13
**输出格式**
F
fix bug  
feilong 已提交
14

每日一练社区's avatar
每日一练社区 已提交
15 16 17
输出到标准输出。
输出一行一个整数代表所求的和。

18
**样例输入**
F
fix bug  
feilong 已提交
19

每日一练社区's avatar
每日一练社区 已提交
20 21 22 23 24
```
4 3
1 2 3 4
```

25
**样例输出**
F
fix bug  
feilong 已提交
26

每日一练社区's avatar
每日一练社区 已提交
27 28 29 30
```
9
```

31
**样例解释**
F
fix bug  
feilong 已提交
32

每日一练社区's avatar
每日一练社区 已提交
33 34 35 36
```
选择2、3、4。
```

每日一练社区's avatar
每日一练社区 已提交
37
以下<span style="color:red">错误</span>的一项是?
每日一练社区's avatar
每日一练社区 已提交
38

每日一练社区's avatar
每日一练社区 已提交
39
## aop
F
fix bug  
feilong 已提交
40

每日一练社区's avatar
每日一练社区 已提交
41
### before
F
fix bug  
feilong 已提交
42

每日一练社区's avatar
每日一练社区 已提交
43 44 45 46
```cpp
#include <bits/stdc++.h>
using namespace std;
```
每日一练社区's avatar
每日一练社区 已提交
47

每日一练社区's avatar
每日一练社区 已提交
48
### after
F
fix bug  
feilong 已提交
49

每日一练社区's avatar
每日一练社区 已提交
50
```cpp
每日一练社区's avatar
每日一练社区 已提交
51

每日一练社区's avatar
每日一练社区 已提交
52 53 54
```

## 答案
F
fix bug  
feilong 已提交
55

每日一练社区's avatar
每日一练社区 已提交
56
```cpp
每日一练社区's avatar
每日一练社区 已提交
57 58 59 60 61 62 63 64 65 66 67
#define ll long long
using namespace std;

const int maxx = 1e5 + 100;
const int maxm = 1e3 + 100;
int a[maxx];
vector<int> p[maxm];
int n, k;

bool cmp(int a, int b) { return a > b; }
int main()
每日一练社区's avatar
每日一练社区 已提交
68
{
每日一练社区's avatar
每日一练社区 已提交
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
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        p[a[i] % k].push_back(a[i]);
    }
    for (int i = 0; i < k; i++)
        sort(p[i].begin(), p[i].end(), cmp);
    int _max = 0;
    for (int i = 0; i < k; i++)
    {
        if (p[i].size() == 0)
            continue;
        if ((3 * i == k || i == 0) && p[i].size() >= 3)
            _max = max(_max, p[i][0] + p[i][1] + p[i][2]);
        for (int j = 0; j < k; j++)
        {
            if (!p[j].size())
                continue;
            int z = k - (i + j) % k;
            if (z < 0)
                continue;
            if (z == i && z == j)
                continue;
            else if ((i != j) && (z == i || z == j) && p[z].size() >= 2)
                _max = max(_max, p[i][0] + p[j][0] + p[z][1]);
            else if (i == j && p[i].size() >= 2 && p[z].size() >= 1)
                _max = max(_max, p[i][0] + p[j][1] + p[z][0]);
            else if (i != j && i != z && j != z && p[i].size() >= 1)
                _max = max(_max, p[i][0] + p[j][0] + p[z][0]);
        }
    }
    printf("%d\n", _max);
    return 0;
每日一练社区's avatar
每日一练社区 已提交
103
}
每日一练社区's avatar
每日一练社区 已提交
104

每日一练社区's avatar
每日一练社区 已提交
105 106 107
```
## 选项

F
fix bug  
feilong 已提交
108

每日一练社区's avatar
每日一练社区 已提交
109
### A
F
fix bug  
feilong 已提交
110

每日一练社区's avatar
每日一练社区 已提交
111
```cpp
每日一练社区's avatar
每日一练社区 已提交
112 113 114 115 116 117 118 119
#define FOR0(a, b) for (int i = a; i < b; ++i)
#define FORE(a, b) for (int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int, int> pii;

ll dp[2][4][1005];
int n, k, a[100005], v[100005];
int main()
每日一练社区's avatar
每日一练社区 已提交
120
{
每日一练社区's avatar
每日一练社区 已提交
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
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &a[i]);
        v[i] = a[i];
        v[i] %= k;
    }
    memset(dp, -0x3f3f3f3f, sizeof dp);
    dp[0][0][0] = 0;
    int d = 0;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 0; j < k; ++j)
        {
            for (int p = 0; p <= 3; ++p)
            {
                if (i < p)
                    continue;
                dp[d ^ 1][p][j] = max(dp[d ^ 1][p][j], dp[d][p][j]);
                if (p > 0)
                    dp[d ^ 1][p][j] = max(dp[d ^ 1][p][j], dp[d][p - 1][((j - v[i]) % k + k) % k] + a[i]);
            }
        }
        d ^= 1;
    }
    cout << dp[d][3][0] << endl;
    return 0;
每日一练社区's avatar
每日一练社区 已提交
148 149 150 151
}
```

### B
F
fix bug  
feilong 已提交
152

每日一练社区's avatar
每日一练社区 已提交
153
```cpp
每日一练社区's avatar
每日一练社区 已提交
154 155 156 157
int n, k, ans = 0;
int temp[3], num[100005], vis[100005] = {0};

void dfs(int s)
每日一练社区's avatar
每日一练社区 已提交
158
{
每日一练社区's avatar
每日一练社区 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
    if (s == 3)
    {
        int t = temp[0] + temp[1] + temp[2];
        if (t % k == 0 && t > ans)
            ans = t;
        return;
    }
    else
    {
        for (int i = 0; i < n; i++)
        {
            if (!vis[i])
            {
                temp[s] = num[i];
                vis[i] = 1;
                dfs(s + 1);
                vis[i] = 0;
            }
        }
    }
}

int main()
{
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)
        scanf("%d", &num[i]);
    dfs(0);
    printf("%d\n", ans);
    return 0;
每日一练社区's avatar
每日一练社区 已提交
189 190 191 192
}
```

### C
F
fix bug  
feilong 已提交
193

每日一练社区's avatar
每日一练社区 已提交
194
```cpp
每日一练社区's avatar
每日一练社区 已提交
195 196
int N, k;
int main()
每日一练社区's avatar
每日一练社区 已提交
197
{
每日一练社区's avatar
每日一练社区 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> N >> k;
    vector<vector<int>> vec(k, vector<int>(3, -1));
    for (int i = 0; i < N; ++i)
    {
        int temp;
        cin >> temp;
        int y = temp % k;
        if (temp > vec[y][0])
        {
            vec[y][2] = vec[y][1];
            vec[y][1] = vec[y][0];
            vec[y][0] = temp;
        }
        else if (temp > vec[y][1])
        {
            vec[y][2] = vec[y][1];
            vec[y][1] = temp;
        }
        else if (temp > vec[y][2])
            vec[y][2] = temp;
    }

    vector<int> ans(3);
    int result = 0;
    for (int i = 0; i < k; ++i)
        for (int j = i; j < k; ++j)
        {
            int r = (k - i + k - j) % k;
            ans[0] = vec[i][0];
            if (i == j)
            {
                ans[1] = vec[i][1];
                if (r == i)
                    ans[2] = vec[i][2];
                else
                    ans[2] = vec[r][0];
            }
            else
            {
                ans[1] = vec[j][0];
                if (r == i)
                    ans[2] = vec[i][1];
                else if (r == j)
                    ans[2] = vec[j][1];
                else
                    ans[2] = vec[r][0];
            }
            if (ans[0] != -1 && ans[1] != -1 && ans[2] != -1 && ans[1] + ans[2] + ans[0] > result)
                result = ans[1] + ans[2] + ans[0];
        }
    cout << result;
每日一练社区's avatar
每日一练社区 已提交
252 253
}
```