http://poj.org/problem?id=1002
这道题耗时一整天,终于搞定了。这道题一开始写的是超时,最后懂了,问题原因是有二重循环加strcmp比较,时间复杂度是O(n^3)所以超时了。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<vector> using namespace std; char PanCh(char ch); struct point{ char str[15]; int num; }; int n; char a[100005][150]; vector<point> vec; bool Comp(const point &a,const point &b) { return strcmp(a.str,b.str)<0; } int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",a[i]); } for(int i=0;i<n;i++){ int len=strlen(a[i]); char b[15]; int k=0; for(int j=0;j<len;j++){ if(a[i][j]==‘-‘) continue; else if(k==3) { b[k++]=‘-‘; b[k++]=PanCh(a[i][j]); } else b[k++]=PanCh(a[i][j]); } b[k++]=‘\0‘; if(vec.size()==0) { point po; po.num=1; strcpy(po.str,b); vec.push_back(po); }else{ for(int i=0;i<vec.size();i++){ if(strcmp(b,vec.at(i).str)==0){ vec.at(i).num++; break; }else if(i==vec.size()-1){ point po; po.num=1; strcpy(po.str,b); vec.push_back(po); break; } } } } int flag=0; sort(vec.begin(),vec.end(),Comp); for(int i=0;i<vec.size();i++){ if(vec.at(i).num!=1){ printf("%s %d\n",vec.at(i).str,vec.at(i).num); flag=1; } } if(flag==0)puts("No duplicates."); return 0; } char PanCh(char ch){ if(ch==‘A‘||ch==‘B‘||ch==‘C‘){ return ‘2‘; }else if(ch==‘D‘||ch==‘E‘||ch==‘F‘){ return ‘3‘; }else if(ch==‘G‘||ch==‘H‘||ch==‘I‘){ return ‘4‘; }else if(ch==‘J‘||ch==‘K‘||ch==‘L‘){ return ‘5‘; }else if(ch==‘M‘||ch==‘N‘||ch==‘O‘){ return ‘6‘; }else if(ch==‘P‘||ch==‘R‘||ch==‘S‘){ return ‘7‘; }else if(ch==‘T‘||ch==‘U‘||ch==‘V‘){ return ‘8‘; }else if(ch==‘W‘||ch==‘X‘||ch==‘Y‘){ return ‘9‘; } return ch; }
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<vector> using namespace std; char PanCh(char ch); struct point{ char str[20]; int num; }; int sum; point points[100005]; int n; char a[100005][150]; bool Comp(const point &a,const point &b) { return strcmp(a.str,b.str)<0; } int main(){ sum=0; freopen("a.txt","r",stdin); scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",a[i]); } for(int i=0;i<n;i++){ int len=strlen(a[i]); char b[15]; int k=0; for(int j=0;j<len;j++){ if(a[i][j]==‘-‘||a[i][j]==‘Q‘||a[i][j]==‘Z‘) continue; else if(k==3) { b[k++]=‘-‘; b[k++]=PanCh(a[i][j]); } else b[k++]=PanCh(a[i][j]); } b[k++]=‘\0‘; if(sum==0) { point po; po.num=1; strcpy(po.str,b); points[sum]=po; sum++; }else{ for(int i=0;i<sum;i++){ if(strcmp(b,points[i].str)==0){ points[i].num++; break; }else if(i==sum-1){ point po; po.num=1; strcpy(po.str,b); points[sum]=po; sum++; break; } } } } sort(points,points+sum,Comp); int flag=0; for(int i=0;i<sum;i++){ if(points[i].num!=1){ flag=1; printf("%s %d\n",points[i].str,points[i].num); } } if(flag==0) printf("No duplicates.\n"); return 0; } char PanCh(char ch){ if(ch==‘A‘||ch==‘B‘||ch==‘C‘){ return ‘2‘; }else if(ch==‘D‘||ch==‘E‘||ch==‘F‘){ return ‘3‘; }else if(ch==‘G‘||ch==‘H‘||ch==‘I‘){ return ‘4‘; }else if(ch==‘J‘||ch==‘K‘||ch==‘L‘){ return ‘5‘; }else if(ch==‘M‘||ch==‘N‘||ch==‘O‘){ return ‘6‘; }else if(ch==‘P‘||ch==‘R‘||ch==‘S‘){ return ‘7‘; }else if(ch==‘T‘||ch==‘U‘||ch==‘V‘){ return ‘8‘; }else if(ch==‘W‘||ch==‘X‘||ch==‘Y‘){ return ‘9‘; } return ch; }
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<algorithm> #include<map> #include<iomanip> using namespace std; char PanCh(char ch); int sum; int n; char a[100005][150]; map<int,int> ma; int main(){ sum=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",a[i]); } for(int i=0;i<n;i++){ int len=strlen(a[i]); char b[15]; int k=0; for(int j=0;j<len;j++){ if(a[i][j]==‘-‘) continue; else b[k++]=PanCh(a[i][j]); } b[k++]=‘\0‘; int num= atoi(b); map<int ,int>::iterator l_it; l_it=ma.find(num); if(l_it==ma.end()){ ma.insert(pair<int,int>(num,1)); }else{ ma[num]++; } } int flag=0; map <int,int>::iterator m1_Iter; for ( m1_Iter = ma.begin( );m1_Iter != ma.end( ); m1_Iter++ ){ if(m1_Iter->second!=1){ int k=m1_Iter->first; int time=m1_Iter->second; flag=1; cout<<setfill(‘0‘)<<setw(3)<<k/10000; cout<<‘-‘; cout<<setfill(‘0‘)<<setw(4)<<k%10000; cout<<‘ ‘<<time<<endl; } } if(flag==0) printf("No duplicates.\n"); return 0; } char PanCh(char ch){ if(ch==‘A‘||ch==‘B‘||ch==‘C‘){ return ‘2‘; }else if(ch==‘D‘||ch==‘E‘||ch==‘F‘){ return ‘3‘; }else if(ch==‘G‘||ch==‘H‘||ch==‘I‘){ return ‘4‘; }else if(ch==‘J‘||ch==‘K‘||ch==‘L‘){ return ‘5‘; }else if(ch==‘M‘||ch==‘N‘||ch==‘O‘){ return ‘6‘; }else if(ch==‘P‘||ch==‘R‘||ch==‘S‘){ return ‘7‘; }else if(ch==‘T‘||ch==‘U‘||ch==‘V‘){ return ‘8‘; }else if(ch==‘W‘||ch==‘X‘||ch==‘Y‘){ return ‘9‘; } return ch; }
问题总结:(1)第一个代码用的是Vector,结果超时,主要是Vector排序耗时很长。
(2)用数组,但是仍然超时,主要就是O(n^3)的时间复杂度的问题,所以对于对于查找可以选择用map,对于比较可以选择将字符串转变成用int类型。容易忽视的是当类型为int时会忽视前面是0的情况,所以需要保持格式。
个人心得:对于一个问题,一定要考虑复杂度问题,很可能没有考虑好就会超时,而且对于使用的STL一定要考虑其复杂度!同时一定要考虑到问题的各个方面!
时间: 2024-10-06 01:18:58