• PAT 甲级 1139 First Contact (30 分)


    思路:

    1.用大数组记录两个人之间是否有关系;
    2.用vector记录某人认识的所有人;
    3.用一个全局变量保存0000这个人是男还是女(因为id的绝对值是unique的)
    4.a喜欢b,使用两层循环遍历a和b认识的每一个人。假设a认识c、b认识d,(a、c需要是同性 & b、d也要是同性 & a不能是d & c不能是b);
    5.输出使用%04d;

    代码:

    #include<iostream>
    #include<vector>
    #include<unordered_map>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    bool rela[9999][9999];
    int sym=-1;
    unordered_map<int,vector<int>> mp;
    bool cmp(const pair<int,int> & a,const pair<int,int> & b){
    	return a.first==b.first?a.second<b.second:a.first<b.first;
    }
    bool iss(int a,int b){
    	if(a==0||b==0) return a==0?(sym^b)>0:(a^sym)>0;
    	else return (a^b)>0;
    }
    int main(){
    	int n,m,k;
    	cin>>n>>m;
    	for(int i=0;i<m;i++){
    		string s1,s2;
    		cin>>s1>>s2;
    		if(s1=="0000"||s2=="0000") sym=1;
    		int f1=atoi(s1.c_str());
    		int f2=atoi(s2.c_str());
    		mp[f1].push_back(f2);
    		mp[f2].push_back(f1);
    		rela[abs(f2)][abs(f1)]=rela[abs(f1)][abs(f2)]=true;	
    	}
    	cin>>k;
    	for(int i=0;i<k;i++){
    		int a,b;
    		cin>>a>>b;
    		vector<pair<int,int>> v;
    		for(auto j:mp[a])
    			for(auto k:mp[b])
    				if(j!=b&&k!=a&&rela[abs(j)][abs(k)]&&iss(b,k)&&iss(a,j))
    					v.push_back(make_pair(abs(j),abs(k)));		
    		printf("%d
    ",v.size());
    		sort(v.begin(),v.end(),cmp);
    		for(auto e:v)
    			printf("%04d %04d
    ",e.first,e.second);
    	}
    	return 0;
    }
    
  • 相关阅读:
    ACCESS中默认值要填双引号
    错误一直找不到
    员工自行车的摆放处
    连接占线导致另一个hstmt
    去裕利面试
    路上又一见闻
    企业的形象
    骏泰面试感觉
    IE 标点符号输入不顺的原因
    C Primer Plus(十七)
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12309076.html
Copyright © 2020-2023  润新知