题解 P3955 【图书管理员】
征途者二号
2019-10-27 21:27:21
好吧,这一道题从本质上看,就是一道纯~~暴力~~模拟,~~但是暴力不能救中国人~~。
一切的起源,都是起源于计算机超快超强的特性,自然而然出现了这一用海量的计算来解题的思路——暴力。~~你废话这么多干啥~~
我简单讲一下我做这道题的思路:
1.把图书馆的数据导入到图书管理员的大脑内(这很ke幻)
3.排个序,以达到题目要求(这样找到就可以直接退出查找了)
2.边读边做,防止出现烦人的超时
4.找一下(用一个叫search函数),并将结果输出
5.结束
接下来我讲一下这个search的自定义函数:
1.从头开始找
·其实可以用STL的lower_bound找到第一个大于等于10^(x-1)的数在a数组中的对应下标,但是由于我在敲代码后这个STL老跟我过不去,所以只能从头找了
2.把要比较的这个a[i]转换成string类型的s2
·接下来介绍一个简单的从int类型转换成string类型的函数:to_string,格式就是这样:
```cpp
string s1=to_string(a[i]);//例子
```
3.这下就可以一位一位地比较了,然后结束
好了我~~废话~~说得够多了,上代码吧
```cpp
#include <bits/stdc++.h>
#define maxn 1100
using namespace std;
int a[maxn],n,m,x;
string s;
int search()
{
for (int i=1;i<=n;i++)
{
string s1=to_string(a[i]);
bool bl=true;//初始化一个辅助判定变量和完成把int的a[i]转为string类型的s2
if (s1.size()<s.size()) continue;//如果图书馆编码的位数比 需求码还短,就可以跳过了
for (int k=1;k<=s.size();k++)//一个位一个位地比较
if (s1[s1.size()-k]!=s[s.size()-k]) //如果对应位不等,就不是
{
bl=false;break;//标记一下,就不用再找下去了
}
// cout<<"CASE:"<<s<<" result:"<<bl<<" AIM: "<<s1<<endl;
if (bl) return a[i];//如果是答案,就返回答案值
}
return -1;//没找到?那就-1
}
int main()
{
cin>>n>>m;//读入
for (int i=1;i<=n;i++)
cin>>a[i];//读入图书馆编码
sort(a+1,a+n+1);//排序(原因?回去看看题目)
for (int i=1;i<=m;i++)
{
cin>>x>>s;
cout<<search()<<endl;//边读边做
}
return 0;//结束
}
```
## **然后喜滋滋地拿到DEV_C++上一试:编译失败**
为什么?
看一看错误提示,你就会发现是to_string出的问题。
因为to_string是C++11的函数,所以会报错
好了,这下就很简单了:把程序拿到洛谷上,选定C++11,我就成功地一次A掉了。
看在我这么辛苦打了一篇题解之后,麻烦给一点宝贵建议吧,毕竟我还是个蒟蒻