CF1690E题解
主要题意:
有 n 个礼物,要两两合并,然后除以 k 最后求和最大。
思路:
先加入每个数除以 k 的商(单独组成 k 的个数),然后全部 mod k 并存入数组,排序,最后双指针一个前一个后求两个余数可以大于等于 k 的两个礼物。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int Maxn = 2e5 + 5; 5 int n, t, a[Maxn], k, l, r; 6 long long cnt; 7 8 int main() 9 { 10 ios::sync_with_stdio(0);//其实不用快读 11 cin.tie(), cout.tie();//关同步流即可 12 cin >> t; 13 while (t--) 14 { 15 cnt = 0; 16 cin >> n >> k; 17 for (int i = 1; i <= n; i++) 18 { 19 cin >> a[i]; 20 cnt += a[i] / k;//求单独组成k的数 21 a[i] = a[i] % k;//求余数 22 } 23 sort(a + 1, a + 1 + n);//排序 24 l = 1; 25 r = n; 26 while (l < r) 27 { 28 while (a[l] == 0) 29 { 30 l++;//0是无论如何也不能组成k的 31 } 32 while ((a[l] + a[r]) % k == 0 && l < r)//等于时 33 { 34 cnt++; 35 l++; 36 r--; 37 } 38 while (a[l] + a[r] > k && l < r)//大于时(其实可以合并) 39 { 40 cnt++; 41 r--; 42 l++; 43 } 44 while (a[l] + a[r] < k && l < r)//小于 45 { 46 l++; 47 } 48 } 49 cout << cnt << "\n"; 50 } 51 return 0; 52 }