P8663 [蓝桥杯 2018 省 A] 倍数问题 题解

a+b+c0(modk),则 amodk+bmodk+cmodk{0,k,2k}

证明比较显然,小于 3kk 的倍数只有 {0,k,2k}

分讨三种情况,对 amodk+bmodk+cmodk=z 的情况枚举 amodk,bmodk,则 cmodk=zamodkbmodk

然后可以得到 amodk,bmodk,cmodk 的值,取同余类中最大值即可,注意重复情况。

复杂度 O(n+k2)

#include <cstdio>
#include <algorithm>
using namespace std;
int n, k, q, f[1050][3];
int main()
{
    scanf("%d%d", &n, &k);
    for (int i = 0; i < k; ++i)
        f[i][0] = f[i][1] = f[i][2] = -6e8;
    for (int i = 1, x, y; i <= n; ++i)
    {
        scanf("%d", &x);
        if (f[y = x % k][0] < x)
            f[y][2] = f[y][1], f[y][1] = f[y][0], f[y][0] = x;
        else if (f[y][1] < x)
            f[y][2] = f[y][1], f[y][1] = x;
        else if (f[y][2] < x)
            f[y][2] = x;
    }
    for (int z = 0; z <= k << 1; z += k)
        for (int i = 0; i < k; ++i)
            for (int j = 0, p; j < k; ++j)
                if ((p = z - i - j) >= 0 && p < k)
                    q = max(q, f[i][0] + f[j][i == j] + f[z - i - j][(i == p) + (j == p)]);
    return !printf("%d", q);
}
posted @   Jijidawang  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示