很头疼的卡在了倒数第二个case:运行超时
新了解了一个STL叫做
unordered_map据说它的速度比map快一些
但是我换用了unordere_map做,依然超时。。。
再后来看了别人地代码,发现正好这里地一串字符是三个数字,可以取巧地用一个1000大小地int型哈希数组来处理
终于解决了超时问题。
综上所述:
以后要少用map,尽量用哈希数组
此外cin和cout的时间复杂度也不容小觑
#include <iostream>
#include <map>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int N,M;
struct Node{
string a;
int num;
}node[10010];
struct Node2{
int a;
int num;
}temp;
bool cmp(Node a,Node b){
if(a.num!=b.num)
return a.num>b.num;
return a.a<b.a;
}
bool cmp2(Node2 a,Node2 b){
if(a.num!=b.num)
return a.num>b.num;
else
return a.a<b.a;
}
int main(){
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++){
cin>>node[i].a;
scanf("%d",&node[i].num);
}
sort(node,node+N,cmp);
int zxc;
string str;
for(int i=1;i<=M;i++){
scanf("%d",&zxc);
cin>>str;
printf("Case %d: %d ",i,zxc);
cout<<str<<endl;
if(zxc==1){
bool flag=true;
for(int j=0;j<N;j++){
if(node[j].a[0]==str[0]){
cout<<node[j].a;
printf(" %d\n",node[j].num);
flag=false;
}
}
if(flag)
printf("NA\n");
}
else if(zxc==2){
int c=0,sum=0;
for(int j=0;j<N;j++){
if(node[j].a.substr(1,3)==str){
c++;
sum+=node[j].num;
}
}
if(c>0){
cout<<c;
printf(" %d\n",sum);
}
else
printf("NA\n");
}
else if(zxc==3){
int w[1000]={0};
for(int j=0;j<N;j++){
if(node[j].a.substr(4,6)==str){
int t=stoi(node[j].a.substr(1,3));
w[t]++;
}
}
vector<Node2>asd;
for(int j=0;j<1000;j++){
if(w[j]!=0){
temp.a=j;
temp.num=w[j];
asd.push_back(temp);
}
}
if(asd.size()>0){
sort(asd.begin(),asd.end(),cmp2);
for(int j=0;j<asd.size();j++){
printf("%03d %d\n",asd[j].a,asd[j].num);
}
}
else
printf("NA\n");
}
else{
printf("NA\n");
}
}
return 0;
}