航班座位_hihocoder

题目2 : 航班座位

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi在给一个家庭旅游团订某次航班的机票。该航班的飞机一共有N排座位,每排座位有10个座位,从左到右依次编号ABCDEFGHJK。其中ABC连在一起,DEFG连在一起,HJK连在一起;而C和D以及G和H被过道隔开。  

现在有M个座位已经被预订,小Hi想知道他最多能安排多少个三口之家搭乘本次航班。注意三口之家需要坐在同一排连续的3个座位上,不能被过道隔开。  

         ABC  DEFG  HJK
    1    XOO  OOOO  OOX
    2    OOO  XXXO  XOO
    3    OOO  OOOO  OXO
         ........

输入

第一行包含两个整数N和M。  

以下M行每行包含一个座位号。  

1 <= N <= 1000000000  

1 <= M <= 100000

输出

输出一个整数代表答案

样例输入
3 7  
1A
1K
3J
2D
2E
2F
2H
样例输出
4

比赛已经结束,去题库提交

写的好复杂啊.....是不是还有简单方法.

  1 #include <iostream>
  2 #include <fstream>
  3 #include <sstream>
  4 #include <map>
  5 #include <string>
  6 #include <list>
  7 #include <forward_list>
  8 #include <deque>
  9 #include <cstdio>
 10 #include <vector>
 11 #include <algorithm>
 12 #include <numeric>
 13 #include <ctime>
 14 #include <iterator>
 15 #include <set>
 16 #include <cstdio>
 17 
 18 using namespace std;
 19 
 20 set<long long> sll1;
 21 
 22 int calgewei(char c){
 23     if(c=='J') return 8;
 24     if(c=='K') return 9;
 25     return c-'A';
 26 }
 27 
 28 int main()
 29 {
 30     long long n,m;
 31     int row;
 32     char col;
 33     long long count=0;
 34     long long rr1;
 35     long long rr2,rr3,rr4,rr5;
 36     scanf("%lld %lld",&n,&m);
 37     for(int i=0;i<m;i++){
 38         scanf("%d%c",&row,&col);
 39         int gewei=calgewei(col);
 40         rr1=row*10+gewei;
 41         if(gewei==0||gewei==1||gewei==2){
 42             rr2=row*10;
 43             if(sll1.find(rr2)!=sll1.end()){
 44                 continue;
 45             }else{
 46                 count++;
 47                 sll1.insert(rr2);
 48             }
 49         }else if(gewei==7||gewei==8||gewei==9){
 50             rr2=row*10+7;
 51             if(sll1.find(rr2)!=sll1.end()){
 52                 continue;
 53             }else{
 54                 count++;
 55                 sll1.insert(rr2);
 56             }
 57         }else{
 58             rr2=row*10+3;
 59             rr3=rr2+1;
 60             rr4=rr3+1;
 61             rr5=rr4+1;
 62             if(gewei==3){
 63                 if(sll1.find(rr2)==sll1.end()&&sll1.find(rr3)==sll1.end()&&sll1.find(rr4)==sll1.end()&&sll1.find(rr5)!=sll1.end()){
 64                     count++;
 65                     sll1.insert(rr2);
 66                 }else{ 
 67                     sll1.insert(rr2);
 68                     continue;
 69                 }
 70             }else if(gewei==4){
 71                 if(sll1.find(rr2)==sll1.end()&&sll1.find(rr3)==sll1.end()&&sll1.find(rr4)==sll1.end() ||
 72                         sll1.find(rr3)==sll1.end()&&sll1.find(rr4)==sll1.end()&&sll1.find(rr5)==sll1.end()){
 73                     count++;
 74                     sll1.insert(rr3);
 75                 }else{
 76                     sll1.insert(rr3);
 77                     continue;
 78                 }
 79             }else if(gewei==5){
 80                 if(sll1.find(rr2)==sll1.end()&&sll1.find(rr3)==sll1.end()&&sll1.find(rr4)==sll1.end() ||
 81                         sll1.find(rr3)==sll1.end()&&sll1.find(rr4)==sll1.end()&&sll1.find(rr5)==sll1.end()){
 82                     count++;
 83                     sll1.insert(rr4);
 84                 }else{
 85                     sll1.insert(rr4);
 86                     continue;
 87                 }
 88             }else if(gewei==6){
 89                 if(sll1.find(rr2)!=sll1.end()&&sll1.find(rr3)==sll1.end()&&sll1.find(rr4)==sll1.end()&&sll1.find(rr5)==sll1.end()){
 90                     count++;
 91                     sll1.insert(rr5);
 92                 }else{
 93                     sll1.insert(rr5);
 94                     continue;
 95                 }
 96             }
 97         }
 98     }
 99     long long res=3*n;
100     printf("%lld\n",res-count);
101     return 0;
102 }
View Code

 

posted @ 2019-01-13 15:17  多一份不为什么的坚持  阅读(982)  评论(0编辑  收藏  举报