• 抢气球_题解


    • 描述

    小A教室的墙上挂满了气球,五颜六色,小朋友们非常喜欢。

    刚一下课,小朋友们就打算去抢这些气球。每个气球在墙上都有一定的高度,

    只有当小朋友跳起来时,手能够到的高度大于等于气球的高度,小朋友才能摘到

    这个气球。为了公平起见,老师让跳的低的小朋友先摘,跳的高的小朋友后摘。

    小朋友都很贪心,每个小朋友在摘气球的时候都会把自己能摘的气球都摘掉。

    很巧的是,小朋友们跳起来手能够着的高度都不一样,这样就不会有跳起来

    后高度相同的小朋友之间发生争执了。

    • 输入

    第一行输入两个空格分隔的整数n,m,其中n表示小朋友的数量,m表示墙上

    气球的数量。

    第二行输入n个正整数(每两个整数之间用空格隔开),第i个数为 ai,表

    示第i个小朋友跳起来手能够着的高度为ai。

    第三行输入m个正整数(每两个整数之间用空格隔开),第i个数为 hi,表

    示第i个气球的高度为hi。

    • 输出

    输出一共n行,每行一个整数。

    第i行表示第i个小朋友摘到的气球数量。

    • 样例输入1

    5 6
    3 7 9 6 4
    1 2 3 4 5 6

    • 样例输出1

    3

    0

    0

    2

    1

    • 样例输入2
      10 10
      1 2 3 4 5 6 7 8 9 10
      3 1 4 6 7 8 9 9 4 12
    • 样例输出2
      1
      0
      1
      2
      0
      1
      1
      1
      2
      0

    【题目分析】

    首先把跳起高度和气球高度都从小到大排序,然后用一个pos 来表示已经选到的气球的位置。枚举每个身高,如果满足条件,pos 一直加,直到不满足条件。

    这样人和气球都只会扫描一遍。

    标程如下

    #include<bits/stdc++.h>
    using namespace std;
    template <typename T> inline void read(T &x)
    {
        x=0;int f=1;char c=getchar();
        for(;c>'9'||c<'0';c=getchar()) if(c=='-') f=-1;
        for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
        x*=f;
    }
    template <typename T> inline void print(T x)
    {
        if(x<0) putchar('-'),x=-x;
        if(x>9) print(x/10);
        putchar(x%10+48);
    }
    long long dis[1010101];
    struct ss{
        int ID;
        long long A;
    };
    ss s1[1010101];
    long long h[1010101],n,m,tot;
    inline bool cmp(ss x,ss y)
    {
        return x.A<y.A;
    }
    int main() 
    {
    //    freopen("balloon.in","r",stdin);
    //    freopen("balloon.out","w",stdout);
        read(n),read(m);
        for(register int i=1;i<=n;++i)
            read(s1[i].A),s1[i].ID=i;
        for(register int i=1;i<=m;++i)
            read(h[i]);
        stable_sort(h+1,h+1+m);
        stable_sort(s1+1,s1+1+n,cmp);
        int pos=0;
        for(register int i=1;i<=n;++i)
        {
            int sum=0;
            int W=s1[i].A;
            int ID=s1[i].ID;
            for(register int j=pos+1;j<=m;++j)
            {
                if(h[j]>W)
                    break;
                else
                    pos++,sum++;
            }
                
            dis[ID]=sum;
        }
        for(register int i=1;i<=n;++i)
            print(dis[i]),putchar('
    ');
        return 0;
    }
  • 相关阅读:
    135编辑器使用教程
    gitalb的搭建与使用
    关于String类型,转换BigDecimal .并且BigDecimal 的乘法计算
    关于MAP转换成驼峰命名法然后转换成实体
    java时间计算,获取某月第一天和最后一天
    Spring 自带的定时任务
    Hibernate jpa 在实体类中对于时间的注解
    noip2014总结
    sroHOBOorz来自HOBO的高精类
    2014年9月6日
  • 原文地址:https://www.cnblogs.com/waylish/p/11384875.html
Copyright © 2020-2023  润新知