算法刷题【洛谷U193902】橡皮泥

异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在CSDN、掘金和个人博客(一定是异想之旅域名)发布,除此之外全部是盗文!


洛谷 U193902 橡皮泥

题目描述

陶陶有 n n n 个橡皮泥,每个橡皮泥的体积为 a i a_i ai

陶陶是一个泥人巨匠,于是他可以进行以下操作:

每次操作选择两个橡皮泥,将其合并,新橡皮泥的体积为两个原体积之和,并将合成后的橡皮泥插入原序列,当然插入的位置无关紧要。

例如,三个橡皮泥的体积为 [2, 1, 4] ,陶陶能够获得 [3, 4], [1, 6] 或 [2, 5] 。

陶陶想知道经过若干次操作后,体积是 3 的倍数的橡皮泥个数最多是多少个?

输入格式

第一行一个整数 T T T

接下来 T T T 组数据,每组数据第一行为一个整数 n n n ,接下来一行有 n n n 个整数,表示这 n n n 个橡皮泥的体积。

输出格式

对于每组数据,输出体积是 3 的倍数的橡皮泥个数最多是多少个

输入输出样例

In 1:

2
5
3 1 2 3 1
7
1 1 1 1 1 2 2

Out 1:

3
3
数据范围

对于 100 % 100\% 100%的数据点: 1 ≤ T ≤ 1000 , 1 ≤ n ≤ 100 , 1 ≤ a i ≤ 1 0 9 1\leq T\le 1000, 1\leq n\le 100, 1\leq a_i \le 10^9 1T1000,1n100,1ai109

题解

显而易见:

  1. 本身是三的倍数直接统计;
  2. 不是的优先一个 除以3余数为1的数 和一个 除以3余数为2的数 配对(因为这样消耗的数字少,严格证明我也不会 );
  3. 再针对多余出来的数字(这些数字取余3的余数一定单调为1或者2),每3个相加配成一个3的倍数。
#include <bits/stdc++.h>
using namespace std;

int n, temp, ans = 0;

int main() {
    int tttt;
    cin >> tttt;
    while (tttt--) {
        cin >> n;
        ans = 0;  // 总共可以形成多少
        int one = 0, two = 0;  // 余数为1或2的数字的个数

        for (int i = 1; i <= n; i++) {
            cin >> temp;
            if (temp % 3) {
                // 不是3的倍数,记录余数是几的个数
                temp % 3 == 1 ? one++ : two++;
            } else
                ans++;  // 是3的倍数则直接累加
        }
        ans += min(one, two);  // 一个余数为1的数字和一个余数为2的数字可以凑成一个3的倍数
        ans += abs(one - two) / 3;  // 多余的部分,每3个数可以凑成一个3的倍数,向下取整
        cout << ans << endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

异想之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值