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  }
Code

 

posted @ 2023-09-09 10:36  mouse_boy  阅读(18)  评论(0编辑  收藏  举报