MagicBuilding HDU - 2192

题意:给你一些高低不平的建筑,即一些数,
只有不同的数才能凑成一个群落,求群落的最少个数
如:1 1 1 1 1 只能是5个群落
如:1 2 3 4 5 只能是1个群落
如:1 2 2 5 5 就是两个群落啦 (1,2,5) (2,5)

法一: 找完一个群落存一下,用数组实现,什么意思呢,一个数组的以为存一个群落
比如 1 2 2 5 5 (1,2,5)是一个群落 (2,5)是一个群落
用b数组(a数组存入原建筑,排序),依次赋值,只要比本次大就不断赋值
如b[0] : 1>0 b[0]存为1 ;2>1 b[0]存为2 5>2 b[0]存为5,存完赋值为零,即下次就不用再找了
b[1]—b[n]类似,最后求出b数组中不为零的个数即可

代码:

/*
* title : MagicBuilding HDU - 2192
* date : 2019-4-01
* author: Wu Zongyuan
*/

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
int a[10010],b[10010];
int main(){
   int T;
   scanf("%d",&T);
   while(T--){
    int n,i;
    int k = 0;
    scanf("%d",&n);
    for(i = 0;i<n;i++){
        scanf("%d",&a[i]);
    }
    sort(a,a+n);
    memset(b,0,sizeof(b));

    for(i = 0;i<n;i++){
        //是零了就不用再进行判断了,直接下一个即可
        if(!a[i])
            continue;
       if(a[i]){
        for(int j = 0;j<n;j++){
            if(a[j]>b[k]){
                b[k] = a[j];
                a[j] = 0;

            }
        }
        k++;
       }
    }
    printf("%d\n",k);
   }
    return 0;
}


法二: 有点类似法一的方法,但不用多次遍历,遍历一次就可以了,就是比当前所存值大才存,
否则就存数组下一位(还是存入的b数组,先把数组值全部赋值为零,最后找非零个数即可)
什么意思呢?
例如 1 2 2 5 5 (a数组中装的值)
现在需要一个b数组来存
还是要先排序,b数组开始全部为零,首先b[0]=1,2>b[0]—b[0]=2,2>b[1]—b[1]=2,5>b[0]—b[0]=5,5>b[1]—b[1]=5

代码:


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
int a[10010],b[10010];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,i;
        int k = 0;
        scanf("%d",&n);
        for(i = 0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        memset(b,0,sizeof(b));
        for(i = 0; i<n; i++)
        {
            for(int j = 0; j<n; j++)
            {
                if(a[i] > b[j])
                {
                    b[j] = a[i];
                    break;
                }
            }
        }
        int ans = 0;
        for(i = 0; i<n; i++)
        {
            if(b[i])
                ans++;
        }
        printf("%d\n",ans);

    }
    return 0;
}

法三:
这种方法我估计肯定会爆炸,超时
即1 2 2 2 2 2 2 2 2 2 2 5 群落数肯定是2的个数
所以就能想到,是数字出现次数最多的那种,有几个这种数字就是有几个群落了
直接求种类数最多的那种,即用数组b,求b[a[i]]++;所以b数组肯定要开很大才能保证正确,我就没有贴代码了 0.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值