1234 倍數問題

2022-09-22 04:27:09 字數 1558 閱讀 2740

眾所周知,小蔥同學擅長計算,尤其擅長計算乙個數是否是另外乙個數的倍數。

但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。

現在小蔥給了你 \(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
dp,貪心

貪心策略:由於需要找出 \(3\) 個和模 \(k\) 為 \(0\) 的最大數,所以不妨將所有模 \(k\) 的餘數的所有數提取出來,只需要前 \(3\) 就行

這樣本質上就是乙個揹包問題了:

這裡需要優化空間,滾動掉第一維,但需要逆序迴圈 \(t\),這樣是為了防止 \(i\) 層更新後的值影響到本身

// problem: 倍數問題

// contest: acwing

// url:

// memory limit: 64 mb

// time limit: 1000 ms

// // powered by cp editor (

// %%%skyqwq

#include //#define int long long

#define help

#define pb push_back

#define fi first

#define se second

#define mkp make_pair

using namespace std;

typedef long long ll;

typedef pairpii;

typedef pairpll;

template bool chkmax(t &x, t y)

template bool chkmin(t &x, t y)

template void inline read(t &x)

while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();

x *= f;

}int n,k,f[1005][4];

int main()

memset(f,-0x3f,sizeof f);

f[0][0]=0;

for(int i=0;i());

for(int j=0;j<3&&j=1;u--)f[t][u]=max(f[t][u],f[(t-x%k+k)%k][u-1]+x);}}

cout

}

leetcode 954 二倍數對陣列

給定乙個長度為偶數的整數陣列 arr,只有對 arr 進行重組後可以滿足 對於每個 0 i len arr 2,都有 arr 2 i 1 2 arr 2 i 時,返回 true 否則,返回 false。示例 1 輸入 arr 3,1,3,6 輸出 false 示例 2 輸入 arr 2,1,2,6 ...

藍橋杯 18省賽 A9 倍數問題 倒序dfs

題目描述 眾所周知,小蔥同學擅長計算,尤其擅長計算乙個數是否是另外乙個數的倍數。但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。現在小蔥給了你 n 個數,希望你從這 n 個數中找到三個數,使得這三個數的和是 k 的倍數,且這個和最大。資料保證一定有解。輸入格式 從標準輸入讀入資料。第一行包括...

數論 數的倍數

曾在做牛客的小白賽遇到這樣的問題,我來總結下 牛客原題鏈結如下 題目很簡單,但是需要總結下,accepted 如下。所有數字的和為3的倍數的數為3的倍數 末位為5或0的數為5的倍數 末三位相加為8的倍數的數為8的倍數 如果乙個整數的奇數字上的數字之和與偶數字上的數字之和的差能 被11整除,那麼這個數...