zoukankan      html  css  js  c++  java
  • hdu-----2491Priest John's Busiest Day(2008 北京现场赛G)

    Priest John's Busiest Day

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1420    Accepted Submission(s): 415

    Problem Description
    John is the only priest in his town. October 26th is the John's busiest day in a year because there is an old legend in the town that the couple who get married on that day will be forever blessed by the God of Love. This year N couples plan to get married on the blessed day. The i-th couple plan to hold their wedding from time Si to time Ti. According to the traditions in the town, there must be a special ceremony on which the couple stand before the priest and accept blessings. Moreover, this ceremony must be longer than half of the wedding time and can’t be interrupted. Could you tell John how to arrange his schedule so that he can hold all special ceremonies of all weddings?
    Please note that:
    John can not hold two ceremonies at the same time. John can only join or leave the weddings at integral time. John can show up at another ceremony immediately after he finishes the previous one.
     
    Input
    The input consists of several test cases and ends with a line containing a zero.
    In each test case, the first line contains a integer N ( 1 ≤ N ≤ 100,000) indicating the total number of the weddings.
    In the next N lines, each line contains two integers Si and Ti. (0 <= Si < Ti <= 2147483647)
     
    Output
    For each test, if John can hold all special ceremonies, print "YES"; otherwise, print “NO”.
     
    Sample Input
    3
    1 5
    2 4
    3 6
    2
    1 4
    5 6
    0
     
    Sample Output
    NO
    YES
     
    Source
     
     题意:
               小镇有n场婚礼在一天之内进行,第i场婚礼的开始时间为s,结束时间为t,在每一场婚礼中,有一个重要的仪式。即牧师给与两位新人传达主的祝福,对于第i场婚礼,祝福仪式可以在[s  , t]中任何时候举行,但是必须超过总时间的一半以上。
              小镇只有一位牧师,所有的祝福仪式都必须要他在场吗。同时,牧师必须在整数时刻开始或者结束祝福仪式,不过他可以在结束之后立刻开始另一场。
    现在给你所有的婚礼的信息请问是否能够安排好一个祝福仪式的顺序,使得牧师能够给所有的新人带去幸福......
              现在给你所有婚礼的信息,请问是否能够安排好一个祝福仪式的顺序,使得牧师能够给所有新人带去幸福...
     
     
    自己写了个搓代码:
    先展示一下大神的代码把!...
    然后再看弱屌的代码....
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 const int maxn = 100100;
     7 struct tnode
     8 {
     9     int s,e;
    10     int ms,me;
    11     int keyinterval;
    12     int id;
    13 }c[maxn];
    14 
    15 bool operator < (const tnode &a , const tnode &b)
    16 {
    17     return (a.ms <b.ms ||(a.ms==b.ms&&a.me<b.me));
    18 }
    19 int n , i;
    20 void init()
    21 {
    22     for(i=0 ; i<n ;i++ ){
    23       scanf("%d%d",&c[i].s,&c[i].e);
    24       c[i].id=i;
    25       c[i].keyinterval = (c[i].e - c[i].s +2)/2 ;
    26       c[i].ms=c[i].s+(c[i].e - c[i].s -1)/2;
    27       c[i].me=c[i].s+1;
    28       if((c[i].e-c[i].s)%2==0)
    29            ++c[i].me;
    30     }
    31    sort(c,c+n);
    32 }
    33 bool work()
    34 {
    35     int now_s , now_e ,last_e;
    36     last_e=0;
    37     for(int i=0 ; i<n ;i++)
    38     {
    39         now_s =c[i].s;
    40         if(now_s<last_e) now_s=last_e;
    41         now_e=now_s+c[i].keyinterval;
    42         if(now_e>c[i].e) return false;
    43         last_e = now_e;
    44     }
    45     return true ;
    46 }
    47 
    48   int main()
    49   {
    50       while(scanf("%d",&n),n!=0)
    51       {
    52           init();
    53           if(work())
    54              printf("YES
    ");
    55           else
    56              printf("NO
    ");
    57       }
    58       return 0;
    59   }
    View Code

     运用STL之后,速度更搓,空间开销也增大了不少....

     代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<vector>
     5 #include<algorithm>
     6 using namespace std;
     7 const int maxn = 100100;
     8 struct tnode
     9 {
    10     int s,e;
    11     int ms,me;
    12     int keyinterval;
    13     int id;
    14     bool operator < (const tnode &b) const
    15     {
    16       return (ms <b.ms ||(ms==b.ms&&me<b.me));
    17     }
    18 };
    19 
    20 int n , i;
    21 tnode cc;
    22 vector<tnode>c;
    23 void init()
    24 {
    25        c.clear();
    26     for(i=0 ; i<n ;i++ ){
    27       scanf("%d%d",&cc.s,&cc.e);
    28       cc.id=i;
    29       cc.keyinterval = (cc.e - cc.s +2)/2 ;
    30       cc.ms=cc.s+(cc.e - cc.s -1)/2;
    31       cc.me=cc.s+1;
    32       if((cc.e-cc.s)%2==0)
    33            ++cc.me;
    34       c.push_back(cc);
    35     }
    36    sort(c.begin(),c.end());
    37 }
    38 bool work()
    39 {
    40     int now_s , now_e ,last_e;
    41     last_e=0;
    42     for(int i=0 ; i<n ;i++)
    43     {
    44         now_s =c[i].s;
    45         if(now_s<last_e) now_s=last_e;
    46         now_e=now_s+c[i].keyinterval;
    47         if(now_e>c[i].e) return false;
    48         last_e = now_e;
    49     }
    50     return true ;
    51 }
    52 
    53   int main()
    54   {
    55       while(scanf("%d",&n),n!=0)
    56       {
    57           init();
    58           if(work())
    59              printf("YES
    ");
    60           else
    61              printf("NO
    ");
    62       }
    63       return 0;
    64   }
    View Code

    然后自己有写了一次..........!

     代码:

    手动的扩栈....

    #program comment (linker ,"/STACK :102400000  102400000")

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<iostream>
     5 #include<algorithm>
     6 #pragma comment(linker, "/STACK:102400000,102400000")  //由于用内分装之后会出现溢栈的情况,所以手动扩栈
     7 using namespace std;
     8 
     9  const int maxn =100100 ;
    10 
    11  struct tnode
    12  {
    13      int s,e;
    14      int ms,me;
    15      int mid;
    16      bool operator < (const tnode b) const
    17      {
    18        return (ms<b.ms||(ms==b.ms)&&me<b.me);
    19      }
    20  };
    21  class  node
    22  {
    23   private:
    24    tnode str[maxn];
    25    int i;
    26   public :
    27      int n;
    28      void init();
    29      bool work();
    30  };
    31 
    32 void  node::init()
    33  {
    34      for(i=0;i<n;i++)
    35      {
    36        scanf("%d%d",&str[i].s,&str[i].e) ;
    37        str[i].mid=(str[i].e-str[i].s)/2 +1 ;
    38        str[i].ms= str[i].s+(str[i].e-str[i].s-1)/2 ;
    39        str[i].me=str[i].s+1 ;
    40        if((str[i].e-str[i].s)%2==0) str[i].me++;
    41      }
    42      sort(str,str+n);
    43  }
    44   bool node::work()
    45   {
    46       int temp_s,temp_e,last_e=0;
    47       for( i=0 ; i<n ; i++ )
    48       {
    49           temp_s=str[i].s;
    50        if(temp_s<last_e) temp_s=last_e;
    51          temp_e = temp_s+str[i].mid;
    52         if(temp_e>str[i].e) return false;
    53           last_e=temp_e;
    54       }
    55       return true ;
    56   }
    57  int main()
    58  {
    59     node  a;
    60     while(scanf("%d",&a.n)!=EOF&&a.n)
    61     {
    62         a.init();
    63        if(a.work())printf("YES
    ");
    64        else printf("NO
    ");
    65     }
    66      return 0;
    67  }
    View Code
     
     
  • 相关阅读:
    1030
    Android网络:开发浏览器(二)——功能完善之长按网页图片菜单
    表达式(四则运算)计算的算法
    [置顶] 得失寸心知
    参考storm中的RotatingMap实现key超时处理
    分布式事务 & 两阶段提交 & 三阶段提交
    遗传算法
    模拟退火算法
    Mysql死锁问题解决方式 & 聚簇索引、隔离级别等知识
    Mysql表锁、行锁、页锁
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3749378.html
Copyright © 2011-2022 走看看