AcWing 1234. 倍数问题

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

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

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

数据范围
1≤n≤10^5,
1≤K≤10^3,
给定的 n 个数均不超过 10^8

输入样例:
4 3
1 2 3 4

输出样例:
9

代码如下:

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int f[4][N];
vector<int> a[N];
int main()
{
    
    
    int n,m;
    cin>>n>>m;
    for (int i = 0;i<n;i++)
    {
    
    
        int x;
        cin>>x;
        a[x%m].push_back(x);
    }
    memset(f,-0x3f,sizeof(f));
    f[0][0] = 0;
    for (int i = 0;i<m;i++)
    {
    
    
        sort(a[i].begin(),a[i].end());
        reverse(a[i].begin(),a[i].end());
        for (int u = 0;u<3 &&u <a[i].size();u++)
        {
    
    
            int t = a[i][u];
            for (int j = 3;j>=1;j--)
                for (int k = 0;k<m;k++)
                {
    
    
                    f[j][k] = max(f[j][k],f[j-1][((k-t)%m+m)%m]+t);
                }
        }
    }
    cout<<f[3][0]<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51955470/article/details/114146629