眾所周知,小蔥同學擅長計算,尤其擅長計算乙個數是否是另外乙個數的倍數。
但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。
現在小蔥給了你 \(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整除,那麼這個數...