1 条题解

  • 0
    @ 2025-8-24 22:40:26

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Lovely_Elaina
    嘟嘟嘟

    搬运于2025-08-24 22:40:26,当前版本为作者最后更新于2022-10-19 20:20:35,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这是本菜鸡的首篇题解,望通过^_^


    思路

    数据范围为 1n1061\leq n\leq 10^61hi3×1031\leq h_i \leq 3\times 10^3

    数据很小啊,我们可以用桶排序来完成。

    其实,让整个题难度变成黄题就是因为它的数据范围。一说到桶排序,整个题就简单起来了呢。

    上次用桶排序的时候还是上次,太久远了

    我们使用两个桶,先用一个桶记矿石高度,循环把所有合成的柱子高度放在另一个桶中就搞定了。

    AC代码

    #include <bits/stdc++.h>
    using namespace std;
    //数组大小 常量前用 k 符合规范
    const int karr = 10010;
    int b[karr],c[karr];
    //max 为系统函数,所以用 _max
    int n,sub,ans,ans2,_max;
    int main(){
        //开启 cin cout 优化
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
    	cin >> n;
    	for(int i = 1; i <= n; i++){
    		cin >> sub;
    		b[sub]++,_max = max(_max,sub);
    	} 
    	for(int i = 1; i <= _max; i++)
    		for(int j = 1; j <= i; j++)
    			if(b[i] && b[j]){
    				if(i == j) c[i+j] += b[i] / 2;
    				else c[i+j] += min(b[i],b[j]);
    			}
        int _2max = _max * 2;
    	for(int i = 1; i <= _2max; i++) ans = max(ans,c[i]);
    	for(int i = 1; i <= _2max; i++) if(c[i] == ans) ans2++;
    	cout << ans << " " << ans2 << endl;
    	return 0;
    }
    
    
    

    第一次写题解,不知道怎么写,望大佬提醒!

    审核大大辛苦了~

    • 1

    信息

    ID
    8103
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者