PAT1139,以及关于c++的cin,cout和c的printf,scanf谁更快的问题

1,题目

2,本题答案

  • 本题思路比较简单,就不列了,分析代码即可。

3,代码

#include<stdio.h>
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int N,M;
vector<string> edges[350];
int num_edges=0;
map<string,int> vertex_edges;
struct Node {
    string first,second;
};
bool cmp(const Node &a,const Node &b) {
    if(a.first!=b.first)
        return a.first<b.first;
    return a.second<b.second;
}
vector<Node> pairs_friends;
string A,B;
int main() {
    scanf("%d %d",&N,&M);
    string p1,p2;
    for(int i=0; i<M; ++i) {
        cin>>p1>>p2;
        if(vertex_edges.find(p1)!=vertex_edges.end()) {
            edges[vertex_edges[p1]].push_back(p2);
        } else {
            vertex_edges[p1]=num_edges;
            edges[num_edges++].push_back(p2);
        }
        if(vertex_edges.find(p2)!=vertex_edges.end()) {
            edges[vertex_edges[p2]].push_back(p1);
        } else {
            vertex_edges[p2]=num_edges;
            edges[num_edges++].push_back(p1);
        }
    }
    int K;
    scanf("%d",&K);
    for(int i=0; i<K; ++i) {
        cin>>A>>B;
        pairs_friends.clear();
        if(vertex_edges.find(A)!=vertex_edges.end()) {
            int posa=vertex_edges[A];
            int lena=edges[posa].size();
            for(int i=0; i<lena; ++i) {
                string first=edges[posa][i];
                if(first==B)
                    continue;
                if((A[0]=='-'&&first[0]=='-')||(A[0]!='-'&&first[0]!='-')) {
                    int posb=vertex_edges[B];
                    int lenb=edges[posb].size();
                    for(int j=0; j<lenb; ++j) {
                        string second=edges[posb][j];
                        if(second==A||second==first)
                            continue;
                        if((B[0]=='-'&&second[0]=='-')||(B[0]!='-'&&second[0]!='-')) {
                            int posfirst=vertex_edges[first];
                            if(find(edges[posfirst].begin(),edges[posfirst].end(),second)!=edges[posfirst].end()) {
                                Node tem;
                                if(first[0]=='-') tem.first=first.substr(1,4);
                                else tem.first=first;
                                if(second[0]=='-') tem.second=second.substr(1,4);
                                else tem.second=second;
                                pairs_friends.push_back(tem);
                            }
                        }
                    }
                }
            }
        } else {
            printf("0\n");
            continue;
        }
        sort(pairs_friends.begin(),pairs_friends.end(),cmp);
        int len=pairs_friends.size();
        printf("%d\n",len);
        for(int i=0; i<len; ++i) {
            printf("%s %s\n",pairs_friends[i].first.c_str(),pairs_friends[i].second.c_str());
        }
    }
    return 0;
}

4,这篇文章的重点

  • 先给出结论
    1,对于输入:不管c++的cin还是c的scanf,在c++没有关闭同步情况下,速度差不多。并且,c++关闭同步的情况应当是适用于有大量的连续数据输入的情况。
    并且还要注意,对于代码存在string(多用于map<string,typename)的情况,最好用cin输入,scanf输入会出现错误,原因暂时不知,知道望指教哈。
    另外,cin输入的时间不稳定,波动有30ms左右,对于时间敏感的题目容易出错。而scanf输入数据的时间消耗较为稳定。因此,输入数据,不适用关闭cin同步的情况下,用scanf较好,有string,必须使用cin。
    2,对于输出:特别指出,对于string的输出,cout和printf差距很大,**cout慢很多!**因此,需要输出string时,尽量转化为char[]用printf进行输出。
  • 结论
    有string,用cin输入,其他情况用scanf稳定。
    输出尽量用printf,有string,必须用printf输出。

5,测试

- 使用cout输出string的情况

		for(int i=0; i<len; ++i) {
            cout<<pairs_friends[i].first<<" "<<pairs_friends[i].second<<endl;
        }
  • 耗时
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    三次提交结果,除了第一次侥幸外,最后一个点都超时。
  • 使用printf输出string:
		for(int i=0; i<len; ++i) {
            printf("%s %s\n",pairs_friends[i].first.c_str(),pairs_friends[i].second.c_str());
        }
  • 耗时:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 可见3次无一列外都通过了,并且差不多在227ms左右。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值