487-3279 (poj1002)

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++]='';
        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
",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++]='';
        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
",points[i].str,points[i].num);
            }
        }
        if(flag==0) printf("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<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++]='';
        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.
");
        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一定要考虑其复杂度!同时一定要考虑到问题的各个方面!

原文地址:https://www.cnblogs.com/Yvettey-me/p/4696973.html