• 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一定要考虑其复杂度!同时一定要考虑到问题的各个方面!

  • 相关阅读:
    Bzoj1101 [POI2007]Zap
    Bzoj2393 Cirno的完美算数教室
    UVa10891 Game of Sum
    Bzoj4128 Matrix
    类的组合
    继承
    属性查找与绑定方法
    类与对象
    面向对象程序设计——基础概念
    修改个人信息的程序
  • 原文地址:https://www.cnblogs.com/Yvettey-me/p/4696973.html
Copyright © 2020-2023  润新知