程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 九度OJ 1334 占座位 (模擬 細心)

九度OJ 1334 占座位 (模擬 細心)

編輯:C++入門知識

九度OJ 1334 占座位 (模擬 細心)


題目1334:占座位

時間限制:1 秒

內存限制:32 兆

特殊判題:否

提交:737

解決:174

題目描述:

sun所在學校的教室座位每天都是可以預占的。
一個人可以去占多個座位,而且一定是要連續的座位,如果占不到他所要求的這麼多座位,那麼他就一個座位也不要了。為了降低難度,每次分配座位按座位號從小到大查找,采用最先適配法分配座位。

輸入:

輸入有多組數據。
每組數據輸入座位排數n,0 然後輸入k(0 命令只有兩種:
1.in id num(代表id,0<=id 2.out id(代表id要釋放他之前占的所有座位)
注意:如果id之前占過座還沒釋放那麼之後他的in命令都是無效的,
如果id之前沒占過座位那麼他的out命令也是無效的。

輸出:

對每個in命令輸出yes或者no,如果命令有效則輸出yes,無效則輸出no。
在yes no後面只帶有回車,不帶其他任何字符。

樣例輸入:
4 10
9
in 1 7
in 2 3
in 3 3
in 3 3
in 4 3
out 2
in 5 6
out 3
in 5 6
樣例輸出:
yes
yes
yes
no
yes
no
yes
做本題要細心細心,再細心。AC代碼 60ms

#include
#include
#include
using namespace std;
typedef struct node{
    int start;
    int end;
}node;
node c[101];
char a[10010];
char in[101];
char out[101];
char op[5];
int main(int argc, char *argv[])
{
    int n,m;
    int id;
    int k;
    //freopen("1334.in","r",stdin);
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        memset(c,0,sizeof(c));
        memset(a,0,sizeof(a));
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        for(int i=1;i<=k;++i)
        {
            scanf("%s",op);
            if(strcmp(op,"in")==0)
            {
                int num;
                scanf("%d%d",&id,&num);
                if(in[id]==0)//沒參加過
                {
                    //have a try
                    int cnt=0;
                    int tt;
                    int flag=0;
                    for(tt=1;tt<=n*n;++tt)
                    {
                        if(a[tt]==0){
                            cnt++;
                            if(cnt==num){
                                flag=1;
                                printf("yes\n");
                                c[id].start=tt-num+1;
                                c[id].end=tt;
                                //printf("start %d end %d\n",c[id].start,c[id].end);
                                in[id]=1;//標志參加了
                                out[id]=0;
                                for(int k=c[id].start;k<=c[id].end;++k)
                                    a[k]=1;//占位置
                                break;
                            }
                        }
                        else if(a[tt]==1)
                            cnt=0;
                    }
                    if(!flag)
                        printf("no\n");
                }
                else
                {
                    //已經參加過了
                    printf("no\n");
                }
            }
            else
            {
                scanf("%d",&id);
                if(out[id]==0)
                {
                    in[id]=0;
                    out[id]=1;
                    int s=c[id].start;
                    int e=c[id].end;
                    for(int i=s;i<=e;++i)
                        a[i]=0;
                }
            }
        }
    }
    return 0;
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved