alice132

 

2025.12.14 作业 - # B4228 [常州市赛 2024] 盒子

题目背景

搬运自 http://czoj.com.cn/p/954。数据为民间数据。

题目描述

小 Y 有 \(n\) 个盒子,第 \(i\) 个盒子的大小是 \(a_i\),小 Y 保证 \(a_i\) 一定是 \(2\) 的若干次方,比如 \(1,2,4,8,16,32,64,128,256,512,1024\cdots\),一个大小为 \(a_i\) 的盒子的容量是 \(\dfrac{a_i}2\),就是说它可以装下总大小不超过 \(\dfrac{a_i}2\) 的其他盒子,特别地,大小为 \(1\) 的盒子不能装下其他盒子。并且,装在盒子里的盒子也可以装其他盒子,比如,大小为 \(8\) 的盒子可以装下一个大小为 \(4\) 的盒子且大小为 \(4\) 的盒子事先已经装了一个大小为 \(2\) 的盒子。

现在小 Y 想知道,最少能有多少个不被其他盒子装下的盒子?

输入格式

第一行 \(1\) 个正整数 \(n\),表示盒子的数量。

第二行 \(n\) 个正整数 \(a_i\),表示每个盒子的大小,保证 \(a_i\) 一定是 \(2\) 的若干次方。

输出格式

一行一个正整数表示最少能有多少个不被其他盒子装下的盒子。

输入输出样例 #1

输入 #1

5
1 2 1 1 8

输出 #1

1

输入输出样例 #2

输入 #2

3
1 1 1

输出 #2

3

输入输出样例 #3

输入 #3

6
1 1 1 4 1 2

输出 #3

3

输入输出样例 #4

输入 #4

3
8 4 2

输出 #4

1

说明/提示

样例 \(\textbf 1\) 解释


图中盒子内部的灰色部分表示盒子不能用来装东西的一半容量,白色部分表示能用来装东西的一半容量,图中只有最大的盒子没有被装在其它盒子中,因此答案为 \(1\)

样例 \(\textbf 2\) 解释

样例 \(\textbf 3\) 解释

样例 \(\textbf 4\) 解释

数据范围

参考数据:\(2^{60}=1\ 152\ 921\ 504\ 606\ 846\ 976\)

对于所有数据,\(1≤n≤10^5, 1≤a_i≤2^{60}\)

测试点编号 特殊性质
\(1\sim3\) \(1\le n\le 3\)
\(4\sim5\) \(1\le a_i\le 4\)
\(6\sim9\) \(1\le n\le 1000\)
\(10\sim12\)

题解

  1. 将盒子从小到大排序,盒子的容量 \(b[i]=s[i]/2\)
  2. 从小到大,依次将小的盒子装到可以装的大盒子中。
  3. 若存在一个盒子 \(i\) ,无法装到剩余的盒子中,剩余的所有盒子都是无法装入,剩余的盒子的数量为 n-i+1。
#include<bits/stdc++.h>
using namespace std;
int n;
long long s[100005],b[100005];
int main() {
    cin>>n;
    for (int i=1;i<=n;i++) cin>>s[i];
    sort(s+1,s+n+1);
    for (int i=1;i<=n;i++) b[i]=s[i]/2;
    int i=1,k=2;
    for (;i<=n;i++) {
        while (k<=n && b[k]-s[i]<0) k++;
        if (k>n) break;
        b[k]-=s[i];
    }
    cout<<n-i+1<<endl;
    return 0;
}

posted on 2026-01-28 22:19  alice_ss  阅读(0)  评论(0)    收藏  举报

导航