zoukankan      html  css  js  c++  java
  • Codeforces Round #228 (Div. 1) A. Fox and Box Accumulation 贪心

    A. Fox and Box Accumulation

    题目连接:

    http://codeforces.com/contest/388/problem/A

    Description

    Fox Ciel has n boxes in her room. They have the same size and weight, but they might have different strength. The i-th box can hold at most xi boxes on its top (we'll call xi the strength of the box).

    Since all the boxes have the same size, Ciel cannot put more than one box directly on the top of some box. For example, imagine Ciel has three boxes: the first has strength 2, the second has strength 1 and the third has strength 1. She cannot put the second and the third box simultaneously directly on the top of the first one. But she can put the second box directly on the top of the first one, and then the third box directly on the top of the second one. We will call such a construction of boxes a pile.

    Fox Ciel wants to construct piles from all the boxes. Each pile will contain some boxes from top to bottom, and there cannot be more than xi boxes on the top of i-th box. What is the minimal number of piles she needs to construct?

    Input

    The first line contains an integer n (1 ≤ n ≤ 100). The next line contains n integers x1, x2, ..., xn (0 ≤ xi ≤ 100).

    Output

    Output a single integer — the minimal possible number of piles.

    Sample Input

    3
    0 0 10

    Sample Output

    2

    Hint

    题意

    有n个箱子,现在对于每一个箱子告诉你这个箱子的上面最多放多少个箱子

    现在你需要使得箱子的列数最小,请问是多少

    题解:

    从表象来说,感觉像一个多背包问题,但实质上是不是的

    这个东西显然是可以贪心的,因为这个箱子你用还是不用,对下一个用啥是没有影响的

    所以直接贪心就好了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 105;
    int vis[maxn],ans;
    int a[maxn];
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++)
        {
            int pre = -1;
            for(int j=i;j<=n;j++)
            {
                if(vis[j])continue;
                if(a[j]>pre)
                {
                    vis[j]=1;
                    pre++;
                }
            }
            if(pre!=-1)ans++;
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    浅谈SQLite——查询处理及优化
    .NET 并行(多核)编程系列之七 共享数据问题和解决概述
    sql 存储过程学习一
    SQL中获得EXEC后面的sql语句或者存储过程的返回值的方法 【收藏】
    script刷新页面,刷新代码
    C#编程中关于数据缓存的经验总结
    SQL存储过程的概念,优点及语法
    SQLite数据库安装、试用及编程测试手记
    c# sqlite 数据库加密
    进销存管理系统的设计与实现
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5451882.html
Copyright © 2011-2022 走看看