请帮我优化我的程序,我的耗时太大了

lftlovecjy 2014-04-20 05:55:01
题目描述:
输入N个学生的信息,然后进行查询。
输入:
输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
02
03
01
04
输出:
输出M行,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”
我的程序是:
#include "iostream"
#include "string"
#include<algorithm>
using namespace std;
int main(){
int num[1000],age[1000];
string name[1000],sex[1000];
int i,n,m,a;
int flag,mid;
while(cin>>n){
for(i=0;i<n;i++)
cin>>num[i]>>name[i]>>sex[i]>>age[i];
cin>>m;
for(i=0;i<m;i++){
cin>>a;
for(mid=n/2,flag=0;mid<=n;){
if(num[mid]==a){
cout<<"0"<<num[mid]<<" "<<name[mid]<<" "<<sex[mid]<<" "<<age[mid]<<endl;
flag=1;
break;
}
else if(num[mid]>a)
mid=mid/2;
else
mid=(mid+n)/2;
}
if(flag!=1)
cout<<"No Answer!"<<endl;
}
}
return 1;
}
...全文
307 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
显圣真君 2014-04-22
  • 打赏
  • 举报
回复
你应该把你修改过的程序再贴出来,可能是你改的有问题
罗博士 2014-04-22
  • 打赏
  • 举报
回复
引用 12 楼 lftlovecjy 的回复:
[quote=引用 11 楼 u012061345 的回复:] [quote=引用 7 楼 lftlovecjy 的回复:] [quote=引用 6 楼 u012061345 的回复:] 数组开成1001,用学号作为数组索引。
能说说怎么实现么,我学艺不精啊 [/quote] 学号01就存在num[1]中 学号101就存在num[101]中 学号990就存在num[990]中 其余没有的初始化为0 这样要查询101,你就直接把num[101],name[101],age[101]拿出来即可 要查询102,num[102]为0,表示不存在[/quote] 按你所说的试了一下,显示Wrong Answer,估计输入学生信息不是按顺序输入的[/quote] 这跟输入顺序没有任何关系。除非你没有完全描述清楚题意。
lftlovecjy 2014-04-22
  • 打赏
  • 举报
回复
引用 11 楼 u012061345 的回复:
[quote=引用 7 楼 lftlovecjy 的回复:] [quote=引用 6 楼 u012061345 的回复:] 数组开成1001,用学号作为数组索引。
能说说怎么实现么,我学艺不精啊 [/quote] 学号01就存在num[1]中 学号101就存在num[101]中 学号990就存在num[990]中 其余没有的初始化为0 这样要查询101,你就直接把num[101],name[101],age[101]拿出来即可 要查询102,num[102]为0,表示不存在[/quote] 按你所说的试了一下,显示Wrong Answer,估计输入学生信息不是按顺序输入的
tbwork 2014-04-22
  • 打赏
  • 举报
回复
没看懂难点所在。。。 直接N大小的对象数组。 然后,用数组下标,可以么?
mujiok2003 2014-04-21
  • 打赏
  • 举报
回复
数据规模不大,线性查找就好,主要性能开销在IO。
罗博士 2014-04-21
  • 打赏
  • 举报
回复
引用 7 楼 lftlovecjy 的回复:
[quote=引用 6 楼 u012061345 的回复:] 数组开成1001,用学号作为数组索引。
能说说怎么实现么,我学艺不精啊 [/quote] 学号01就存在num[1]中 学号101就存在num[101]中 学号990就存在num[990]中 其余没有的初始化为0 这样要查询101,你就直接把num[101],name[101],age[101]拿出来即可 要查询102,num[102]为0,表示不存在
lftlovecjy 2014-04-21
  • 打赏
  • 举报
回复
引用 6 楼 u012061345 的回复:
数组开成1001,用学号作为数组索引。
能说说怎么实现么,我学艺不精啊
罗博士 2014-04-21
  • 打赏
  • 举报
回复
数组开成1001,用学号作为数组索引。
lftlovecjy 2014-04-21
  • 打赏
  • 举报
回复
引用 4 楼 u012061345 的回复:
学号的范围是多少?
1-1000
於黾 2014-04-21
  • 打赏
  • 举报
回复
不用真的循环查询的次数 比如我输入了6个学号,你可以一次遍历就匹配上所有的6个学生信息,而不用每个学号真的遍历一次. 这样速度就只跟你的总学生信息有关,而跟你查询多少个无关
赵4老师 2014-04-21
  • 打赏
  • 举报
回复
_lfind bsearch qsort
罗博士 2014-04-20
  • 打赏
  • 举报
回复
学号的范围是多少?
lftlovecjy 2014-04-20
  • 打赏
  • 举报
回复
引用 2 楼 buyong 的回复:
用hash或者红黑树,可以用stl的话直接用std::map存储和查找
这个太高深了,我不懂啊
buyong 2014-04-20
  • 打赏
  • 举报
回复
用hash或者红黑树,可以用stl的话直接用std::map存储和查找
kuankuan_qiao 2014-04-20
  • 打赏
  • 举报
回复

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧