题解 P3955 【图书管理员】

征途者二号

2019-10-27 21:27:21

Solution

好吧,这一道题从本质上看,就是一道纯~~暴力~~模拟,~~但是暴力不能救中国人~~。 一切的起源,都是起源于计算机超快超强的特性,自然而然出现了这一用海量的计算来解题的思路——暴力。~~你废话这么多干啥~~ 我简单讲一下我做这道题的思路: 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掉了。 看在我这么辛苦打了一篇题解之后,麻烦给一点宝贵建议吧,毕竟我还是个蒟蒻