JOI2006模擬試験2 問題3@C++ lizanの指摘により書き直し(46)
#include <cstdio> #include <algorithm> #include <vector> #include <string> using namespace std; class compare_query { public: bool operator()(const pair<string,int>& o1, const pair<string,int>& o2) const { const string& s1=o1.first; const string& s2=o2.first; if(s1.size()==s2.size()) return (s1<s2); return s1.size()<s2.size(); } }; int main(int argc,char* argv[]) { vector<pair<string,int> > query_map; int n; scanf("%d\n",&n); for(int i=0;i<n;i++) { char name[6]; int num; scanf("%s %d\n",name,&num); query_map.push_back(pair<string,int>(name,num)); } sort(query_map.begin(),query_map.end(),compare_query()); string last_name=""; int sum=0; for(vector<pair<string,int> >::iterator i=query_map.begin();i!=query_map.end();++i) { if(last_name==i->first) { sum+=i->second; } else { if(last_name.size()!=0) { printf("%s %d\n",last_name.c_str(),sum); } last_name=i->first; sum=i->second; } } if(last_name.size()!=0) { printf("%s %d\n",last_name.c_str(),sum); } return 0; }
なるほど。まだまだ学ぶことは多そうだ。