zoukankan      html  css  js  c++  java
  • Distributing Parts

    Distributing Parts

    题目链接:http://codeforces.com/problemset/problem/496/E

    贪心

    将音乐和人都以低音升序排序,贪心处理低音更低的音乐,找出低音小于等于它的歌手,二分查找高音与它最近的人。因为剩下的人的低音一定小于后面的歌的低音,而我们选择出了满足条件的高音的最小的人,让后面的歌尽有可能的有人唱。然而不知道为什么我用lower_bound(s.begin(),s.end(),modle)会TLE,而用s.lower_bound(modle)就能过,这两者实现不同吗?

    代码如下:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<set>
     6 #define N 100005
     7 using namespace std;
     8 struct nod{
     9     int l,r,num,index;
    10 }musics[N],men[N];
    11 int k[N],ans[N];
    12 bool cmp(nod a,nod b){
    13     if(a.l==b.l)return a.r<b.r;
    14     return a.l<b.l;
    15 }
    16 int n,m;
    17 int main(void){
    18     scanf("%d",&n);
    19     for(int i=1;i<=n;++i){
    20         musics[i].num=i;
    21         scanf("%d%d",&musics[i].l,&musics[i].r);
    22     }
    23     sort(musics+1,musics+1+n,cmp);
    24     scanf("%d",&m);
    25     for(int i=1;i<=m;++i){
    26         men[i].num=i;
    27         scanf("%d%d%d",&men[i].l,&men[i].r,&k[i]);
    28     }
    29     sort(men+1,men+1+m,cmp);
    30     bool flag=1;
    31     int tt=1;
    32     set<pair<int,int> >s;
    33     for(int i=1;i<=n;++i){
    34         while(tt<=m&&men[tt].l<=musics[i].l){
    35             s.insert(make_pair(men[tt].r,men[tt].num));
    36             tt++;
    37         }
    38         set<pair<int,int> >::iterator it;
    39         it=s.lower_bound(make_pair(musics[i].r,0));
    40         if(it==s.end()){
    41             flag=0;
    42             break;
    43         }
    44         if(musics[i].r<=it->first){
    45             ans[musics[i].num]=it->second;
    46             k[it->second]--;
    47             if(k[it->second]==0)
    48                 s.erase(*it);
    49         }else{
    50             flag=0;
    51             break;
    52         }
    53     }
    54     if(flag){
    55         printf("YES
    ");
    56         for(int i=1;i<=n;++i)
    57             printf("%d%c",ans[i],n==i?'
    ':' ');
    58     }else printf("NO
    ");
    59 }
  • 相关阅读:
    go语言学习十七
    go语言学习十六
    go语言学习十五
    go语言学习十四
    go语言学习十三
    go语言学习十二
    go语言学习十一
    go 语言学习十
    go 语言学习九
    go 语言学习八
  • 原文地址:https://www.cnblogs.com/barrier/p/5777739.html
Copyright © 2011-2022 走看看