Source: Rocky Mountain 2000
比较烦人的字符串处理问题
题目对于数据范围也没有给出明确的说明
只能开一个大数组来模拟了。
然后每次借走了就标记一下
当还回来的时候就要把这个书在队列最后再新加入了。
输出就按照题目的就可以了
多注意就是了
第一次提交忘记了去掉freopen了
1#include<map>
2#include<string.h>
3#include<stdio.h>
4#include<string>
5using namespace std;
6char cz[40],str[40],use[1000];
7char data[1000][40];
8map<string,int> name;
9string now,t;
10int l,N,n,num[1000];
11void PRINT()
12{
13 int i;
14 for(i=l-1;i>=0;i--)
15 if(use[i])
16 {
17 printf("%s%4d\n",data[i],num[i]);
18
19 }
20 printf("AVAILABLE SHELF SPACE: %4d\n\n",N-n);
21 gets(str);
22}
23void ADD()
24{
25 int k,temp=1,L=0;
26 char ch;
27 for(k=0;k<6;k++)scanf("%c",&ch);
28 gets(data[l]);
29 sscanf(data[l]+30,"%d",&L);
30 data[l][30]=0;
31 n+=L;num[l]=L;
32
33 t=data[l];
34 name[t]=l;
35 use[l]=1;
36 k=0;
37 while(n>N)
38 {
39 if(use[k])
40 {
41 use[k]=0;
42 n-=num[k];
43 }
44 k++;
45 }
46 l++;
47}
48void CHECKOUT()
49{
50 int k,i;char ch;
51 scanf("%c",&ch);
52 gets(str);
53 for(i=strlen(str);i<30;i++)str[i]=' ';
54 str[30]=0;
55 t=str;
56 k=name[t];
57 use[k]=0;
58 n-=num[k];
59}
60void RETURN()
61{
62 int k,i;
63 char ch;
64 for(i=0;i<3;i++)scanf("%c",&ch);
65 gets(str);
66 for(i=strlen(str);i<30;i++)str[i]=' ';
67 str[30]=0;
68 t=str;
69 k=name[t];
70 for(i=0;i<31;i++)data[l][i]=data[k][i];
71 use[l]=1;num[l]=num[k];
72 n+=num[l];
73 k=0;
74 while(n>N)
75 {
76 if(use[k])
77 {
78 use[k]=0;
79 n-=num[k];
80 }
81 k++;
82 }
83 l++;
84}
85int main()
86{
87 //freopen("bbbbbbbbbb.txt","w",stdout);
88 scanf("%d",&N);n=0;l=0;
89 name.clear();
90 memset(use,0,sizeof(use));
91 while(scanf("%s",cz)!=EOF)
92 {
93 now=cz;
94 if(now=="PRINT")PRINT();
95 else if(now=="ADD")ADD();
96 else if(now=="CHECKOUT")CHECKOUT();
97 else if(now=="RETURN")RETURN();
98 }
99 return 0;
100}
101