Description
给出学生姓名和分数,要求你输入姓名查询分数。
Input
输入包含T组测试数据。
开头是一个正整数T (0<T<10),为测试数据数量。
对于每组测试数据,第一行是一个正整数N (0<N<=100000)。
接下来有N行,每行包含一个姓名和一个分数,姓名长度不超过50个字符,分数为整数,范围在[0, 100]之内,两者用空格隔开。
接下来一行是一个正整数Q (0<Q<=5000) 代表查询次数。接下来有Q行,每行包含一个姓名,系统保证输入的每个姓名都是不同的。
Output
对于每次查询,输出对应的分数,若该学生不存在,则输出“error”。
Samples
input Copy
1 5
cjc 58
loy 59
zl 92
ydw 80
zz 100
3
cjc
loy
wzj
output Copy
58
59
error
#include <stdio.h>
#include <string.h>
#include <map>
#include <iostream>
using namespace std;
void print(map<string,int>mp);
struct chaxu
{
char name[51];
int s;
};
char w[1000];
map<string,int>mp;
map<string,int>mp2;
struct chaxu p[100000];
int main(void)
{
int t,n,m;
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%d",&n);
getchar();
for(int i=0;i<n;++i)
{
scanf("%s %d",&p[i].name,&p[i].s);
mp2[p[i].name]++;
getchar();
}
for(int i=0;i<n;++i)
{
mp[p[i].name]=p[i].s;
}
scanf("%d",&m);
getchar();
while(m--)
{
gets(w);
if(mp2[w]!=0) cout<<mp[w]<<endl;
else if(mp2[w]==0) printf("error\n");
}
// print(mp);
mp.clear();
}
return 0;
}
void print(map<string,int>mp)
{
for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++)
{
cout<<"key的值为"<<(*it).first<<" value: "<<(*it).second<<endl;
}
}
//这道题就是如果能用字符串当下表就好了,所以自然而然的就想到了map,map只知道一些基本用法,如逆序输出
map<int,int>mp;
map<int,int>::reverse_iterator it;
for(it=mp.rbegin();it!=rend;it++)
还是it->first it->second;
然后你想试试用map和不用map的时间差
有一个时间函数是计算时间用的
#include <time.h>
clock_t start,stop;
printf("%e\n",(double)clock()/CLOCKS_PER_SEC);
至于为什么要用这个%e,是因为他的精度高啊,加油。