记录一下错误:1.NA的条件没有判断 2.只有vector才有resize和sort 3.cin和cout速度较慢,endl换行可以用"\n"代替或者直接使用scanf和printf 3.map里的string只能是string类型而不是char[]
学习到的新方法:1.cmp的写法可以使用三元式子更加简洁。 2.struct结构体元素的可以直接用{member1,member2}直接构造 3.map可以用unordered_map代替加快速度。 4.关于迭代器的循环的新方法 for (auto it : m) ans.push_back({it.first, it.second});。 5.string.c_str() :将string和char[]类型的字符串互相转换:string数据的输入输出只能用cin/cout,如果用scanf和printf要使用c_str()的方法转换 5.成员变量也是string可以用v[j].cardName[0]
AC的方法如下:--这道题主要花费的时间在于运行超时
#include<iostream>
#include<vector>
#include<unordered_map>
#include<cstdio>
#include<algorithm>
using namespace std;
//关于速度优化:unordered_map 以及输入输出注意换成scanf/printf
struct Student{
string cardName;
int score;
}stu;
int N,M;
bool cmp1(Student a,Student b){
if(a.score>b.score)return true;
else if(a.score==b.score){
if(a.cardName<b.cardName)return true;
}
return false;
// return a.score != b.score ? a.score > b.score : a.cardName < b.cardName;
}
int main(){
cin>>N>>M;
vector<Student> v(N);
for(int i=0;i<N;i++){
cin>>v[i].cardName>>v[i].score;
}
for(int i=1;i<=M;i++){
int type;string term;
cin>>type>>term;
printf("Case %d: %d %s\n",i,type,term.c_str());//printf里的string只能是C类型的str term.c_str();
vector<Student> ans;
if(type==1){
//直接循环找
for(int j=0;j<N;j++){
if(v[j].cardName[0]==term[0])ans.push_back(v[j]);//term[0](char)而不是term(string)
}
}else if(type==2){
int sum=0,count=0;
for(int j=0;j<N;j++){
if(v[j].cardName.substr(1,3)==term){
count++;
sum+=v[j].score;
}
}
if(count==0){
cout<<"NA\n";
//printf("NA\n");
}else{
cout<<count<<' '<<sum<<"\n";
//printf("%d %d\n",count,sum);
}
continue;
}else{
unordered_map<string,int> m;
for(int j=0;j<N;j++){
if(v[j].cardName.substr(4,6)==term){
m[v[j].cardName.substr(1,3)]++;//count计数
}
}
// for(auto it=m.begin();it!=m.end();it++){
// stu.cardName=it->first;
// stu.score=it->second;
// ans.push_back(stu);
// }
for (auto it : m) ans.push_back({it.first, it.second});
}
if(ans.size()==0){
cout<<"NA\n";
//printf("NA\n");
continue;
}
sort(ans.begin(),ans.end(),cmp1);
for(int j=0;j<ans.size();j++){
cout<<ans[j].cardName<<' '<<ans[j].score<<"\n";//将endl换行换成"\n"换行也可以加快速度:endl强制刷新缓冲区
//printf("%s %d\n",ans[j].cardName.c_str(),ans[j].score);//cout比prinf慢:cin/cout 默认与c标准输入输出库的缓冲同步
}
}
return 0;
}
第一次用到的方法:(原先以为算法出错所以换的--所以运行超时的关键点就在于unordered_map和 cout<<"\n"输出)
#include<iostream>
#include<vector>
#include<unordered_map>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Student{
string cardName;
int score;
}stu;
int N,M;
bool cmp1(Student a,Student b){
if(a.score>b.score)return true;
else if(a.score==b.score){
if(a.cardName<b.cardName)return true;
}
return false;
}
int main(){
cin>>N>>M;
unordered_map<string,vector<Student>> m1;
unordered_map<string,int> m2;
unordered_map<string,int> m2_num;
unordered_map<string,vector<string>> m3;//date符合条件的情况下
//输入时直接预处理
while(N--){
string cid;int score;
cin>>cid>>score;
stu.cardName=cid;
stu.score=score;
string level=cid.substr(0,1);//A T B
m1[level].push_back(stu);//维持type=1
string site=cid.substr(1,3);
m2[site]+=score;//维持type=2
m2_num[site]++;
string date=cid.substr(4,6);//yymmdd
m3[date].push_back(site);
}
for(int i=1;i<=M;i++){
int type;string term;
cin>>type>>term;
//cout<<type<<' '<<term<<endl;
printf("Case %d: %d %s\n",i,type,term.c_str());//printf里的string只能是C类型的str term.c_str();
if(type==1){
if(m1[term].size()==0){
cout<<"NA\n";
continue;
}
sort(m1[term].begin(),m1[term].end(),cmp1);
for(int j=0;j<m1[term].size();j++){
cout<<m1[term][j].cardName<<' '<<m1[term][j].score<<"\n";
//printf("%d %d\n",m1[term][j].cardName,m1[term][j].score);
}
}else if(type==2){
if(m2_num[term]==0){
cout<<"NA\n";
}else{
cout<<m2_num[term]<<' '<<m2[term]<<"\n";
}
}else{
if(m3[term].size()==0){
cout<<"NA\n";
continue;
}
unordered_map<string,int> middle;//存放<site,count>
for(int j=0;j<m3[term].size();j++){
middle[m3[term][j]]++;
//cout<<"---"<<middle[m3[term][j]]<<endl;
}
//排序用vector
vector<Student> v3;
for(auto it=middle.begin();it!=middle.end();it++){
// cout<<it->first<<' '<<it->second<<endl;
stu.cardName=it->first;
stu.score=it->second;
v3.push_back(stu);
}
sort(v3.begin(),v3.end(),cmp1);
for(int j=0;j<v3.size();j++){
cout<<v3[j].cardName<<' '<<v3[j].score<<"\n";
}
}
}
return 0;
}