美文网首页Greedy
Coffee Break(Set,贪心)

Coffee Break(Set,贪心)

作者: 雨落八千里 | 来源:发表于2019-08-12 19:18 被阅读0次

    Coffee Break

    题意

    给你n个数分组,分组的数量尽可能的少,且每组中的两个数最少相差d+1;

    思路:

    从小到大排序,从x=1个开始,找比第1个大d+1的第一个数,在x等于这个刚找到的数,在找比它大d+1的第一个数。一天能经可能的多放。第二天从新开始,但是在第一天的就不能在第二天了。。。

    #include<bits/stdc++.h>
    #define INF 0x3f3f3f3f
    using namespace std;
    const int M=2*1e5+10;
    int a[M];
    map<int,int>mp;
    int n,m,d;
    int main( )
    {
        while(~scanf("%d%d%d",&n,&m,&d))
        {
            set<int> s;//set默认从小到大排序
            set<int>::iterator it;//指针
            mp.clear( );
            for(int i=0; i<n; i++)
            {
                scanf("%d",&a[i]);
                s.insert(a[i]);
                mp[a[i]]=i;
            }
            int ans=1;
            int cnt=0;
            while(s.size( ))
            {
                it=s.lower_bound(cnt);//找出比cnt大或等于的第一个数
                if(it==s.end( ))//重新开一天
                {
                    ans++;
                    cnt=0;
                }
                else
                {
                    mp[*it]=ans;
                    s.erase(*it);//删除这个数,不删除的话,一个数可能会出现在不同的天数
                    cnt=*it+d+1;//这个数加上d+1
                }
            }
            printf("%d\n",ans);
            for(int i=0;i<n;i++)
            {
                printf("%d%c",mp[a[i]],i==n-1?'\n':' ');
            }
        }
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:Coffee Break(Set,贪心)

        本文链接:https://www.haomeiwen.com/subject/sxhpjctx.html