【AHOI 2003】管理图书

【题目】

题目描述:

快毕业了,学校安排了毕业实习,小可可被安排去图书馆做公益劳动。

图书馆的书都是严格按照索书号的字母顺序从小到大排列的,并依次整齐地排列在书架上。总是从前往后排满一个书架再排后一个书架,每个书架都是从上往下排满一层之后再排下一层。

如果一层中还有一空余的宽度,下一本要排的图书的厚度超过了其空余宽度,则该空余位置不再放书,把那本书排到下一层,如果该书架已排满,则排到下一个书架上。注意:任意两本书的索书号都不会相同。最厚图书的厚度也不会超过书架的宽度。

尽管如此,要找一本书还是需要不少时间的。图书馆中缺少计算机方面的技术人员,因此馆长要计算机专业的小可可在公益劳动的同时编写一个图书定位系统,用来查询每本书在书架上的准确位置。

输入格式:

文件中第一行依次有四个用空白字符隔开的正整数 b,r,w,q,其中:b(b ≤ 10000)表示图书的总数;r(r ≤ 20)表示书架的层数;w(w ≤ 1000)表示书架的宽度;q(q ≤ b)表示待查询的图书数目,书架数目足够多。

随后的 b 行,每行表示一本图书的信息,依次是该书的索书号、书名和厚度,索书号和书名之间可能有一个空白字符隔开,也可能没有空格隔开。书名和厚度之间有一个空格隔开。索书号和书名都是用英文的双引号(")括起来的,厚度是一整数值。书名本身没有双引号。

最后的 q 行,每行存放了一本待查询位置的图书的索书号,也是用双引号括起来的。

输出格式:

依次输出每一本待查询图书的存放位置,用该书所在书架架号与层号来表示,一行对应一本图书。如果找不到,则该书所在书架架号与层号都用零来表示。书架的架号与层号都是从 1 开始编号的。

样例数据:

输入

5 2 60 2
"TP312C" "C++ Programming" 10
"TP316.86 X101" "Windows 2000 Server Professional Reference" 50
"TP312C C452" "Visual C++ Programming" 10
"TP311.13 L938" "Databases: Design, Development & Deployment Using Microsoft Access" 10
"TP 311.128AC X060" "Microsoft Access 2000" 30
"TP 311.128AC X060"
"TX909"

输出

1 1
0 0

备注:

【数据范围】
对 20% 的输入数据 :2 ≤ b ≤ 100 ;
对 100% 的输入数据 : 2 ≤ b ≤ 10000 。
索书号、书名的长度均不超过 255 个字符(不含)

【分析】

我们把这道题分成三部分,按每个部分来讲解

(1)读入图书的信息

图书的信息中包含索引号书名以及厚度,其中书的书名是完全没用的,我们只需要记录书的索引号和厚度。一开始我用的是 gets 读入,但是后来发现了一些问题,又没有找到错误,一怒之下就改成了用 getchar 来读(跟读优写法差不多)

(2)对所有的书排序,并放进书架里

这里排序是对书的索引号进行排序,不是书名(我因为这个 WA 了两次),用 sort 就可以轻松搞定。将书放进书架的话就直接模拟一遍放书的过程,代码中我就先假设有无限层,看它在第几层,然后再去推它在第几个书架

(3)查找书的位置

由于代码中我用了 map,查询起来非常方便,也比较快,当然如果不会 map 的话,我们可以这样考虑:由于我们对所有的书排过序,满足单调性,查找的话就用二分查找,也是一个效率高的算法

具体的实现方法就看代码吧~

【代码】

#include<map>
#include<cctype>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 10005
using namespace std;
map<string,int>ans;
struct node
{
	string s;
	int thick;
}a[N];
int Read_int()
{
	int x=0;
	char c=getchar();
	while(!isdigit(c))
	  c=getchar();
	while(isdigit(c))
	{
		x=(x<<1)+(x<<3)+(c^'0');
		c=getchar();
	}
	return x;
}
string Read_string()
{
	string s="";
	char c=getchar();
	while(c!='"')
	  c=getchar();
	c=getchar();
	while(c!='"')
	{
		s+=c;
		c=getchar();
	}
	return s;
}
bool comp(const node &p,const node &q)
{
	return p.s<q.s;
}
int main()
{
	int b,r,w,q,i,t1,t2,k=0,sum=1;
	char c;
	string num;
	scanf("%d%d%d%d",&b,&r,&w,&q);
	for(i=1;i<=b;++i)
	{
		a[i].s=Read_string();
		Read_string();
		a[i].thick=Read_int();
	}
	sort(a+1,a+b+1,comp);
	for(i=1;i<=b;++i)
	{
		k+=a[i].thick;
		if(k>w)
		{
			sum++;
			k=a[i].thick;
		}
		ans[a[i].s]=sum;
	}
	for(i=1;i<=q;++i)
	{
		num=Read_string();
		if(!ans[num])
		  printf("0 0\n");
		else
		{
			t1=ans[num]/r;
			t2=ans[num]%r;
			if(t2)  t1++;
			else  t2=r;
			printf("%d %d\n",t1,t2);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/forever_dreams/article/details/81670571
今日推荐