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++]=‘\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-08-05 05:27:07

487-3279 (poj1002)的相关文章

【POJ 3279 Fliptile】开关问题,模拟

题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意只扩散一圈,不是连锁反应. 求最少翻转几个位置能够使所有n*m个位置都变为白色.若有解,求字典序最小的翻转方案(给出每个位置的翻转次数). 数据范围:n, m 属于 [1, 15] 思路:我们把翻转方案中的翻转称为“主动翻转”,翻转过程中受邻居影响而发生的翻转称为“被动翻转”.观察例子可得出如下几个

poj1002

487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 234901   Accepted: 40968 Description Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phras

POJ 3279 Fliptile(DFS+反转)

题目链接:http://poj.org/problem?id=3279 题目大意:有一个n*m的格子,每个格子都有黑白两面(0表示白色,1表示黑色).我们需要把所有的格子都反转成黑色,每反转一个格子,它上下左右的格子都会跟着反转.请求出用最小步数完成反转时每个格子反转的次数.有多个解时,输出字典序最小的一组. 解题思路:只要枚举第一行的2^m种情况,如果一个位置上一行是1,那这个位置一定要反转,因为只有这一行能改变上一行,所以每一行的状态都是由前一行决定的.只要最后判断最后一行是不是都是0即可,

win git error init_cheap-VirtualAlloc pointer is null, Win32 error 487

win git error init_cheap:VirtualAlloc pointer is null, Win32 error 487 标签(空格分隔): git 在idea利用git进行代码更新时遇到的问题,google了一下,早StackOverflow找到解决办法,在此share一下 Error message E:\storm-sql>git pull origin joeywen 0 [main] us 0 init_cheap: VirtualAlloc pointer is

POJ 3279 Fliptile (二进制枚举+模拟)

Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3992   Accepted: 1518 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which

3279 奶牛健美操

3279 奶牛健美操 USACO 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接两个顶点的双向路,使得每对点之间恰好有一条简单路径.简单的说来,这些点的布局就是一棵树,且每条边等长,都为1. 对于给定的一个奶牛路径集合,精明的奶牛们会计算出任意点对路径的最大值,我们称之

codevs 3279 奶牛健美操

3279 奶牛健美操   USACO  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond       题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接两个顶点的双向路,使得每对点之间恰好有一条简单路径.简单的说来,这些点的布局就是一棵树,且每条边等长,都为1. 对于给定的一个奶牛路径集合,精明的奶牛们会计算出任意点对路径的最大值,我们称

Git新建仓库时报:Win32 error 487

Git新建仓库时报:Win32 error 487: Couldn't reserve space for cygwin's heap, Win32 error 0 解决方法: 1.进入本地Git安装目录下的bin目录,比如我的是: C:\Users\zhangwwa\AppData\Local\Atlassian\SourceTree\git_local\bin 2.观察是否有rebase.exe和msys-1.0.dll两个文件,如果有,说明进入的目录正确 3.先执行 tasklist /m

ZOJ 3279

线段树单点更新 //============================================================================ // Name : E.cpp // Author : L_Ecry // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================

CODEVS 3279 奶牛的健美操

3279 奶牛健美操 USACO 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接两个顶点的双向路,使得每对点之间恰好有一条简单路径.简单的说来,这些点的布局就是一棵树,且每条边等长,都为1. 对于给定的一个奶牛路径集合,精明的奶牛们会计算出任意点对路径的最大值,我们称之为这个路径集合的直径