PAT(甲级)2019年冬季考试 7-3 Summit (25分)
今天做了套往年卷子,做的很慢,基本是一小时做一个题,这道题属于第三题,最后的最后我有了思路,但我不知道为什么pat考试时间一过就不允许再提交了,也无法检验我的思路是否正确。在自己的ide上跑了展示用例,是对上了。
对于这题我的思路是
1. 建立邻接矩阵图,按题输入将有联系的点直接距离设置为1
2.对每个长度为L的序列v1,遍历,从1-N中找哪些值和序列v1中的几个元素都连接,如果连接则加入另一个vector v。
3.观察结构序列v,如果是空的就是第三种情况,这几个首脑都互不认识需要帮助。如果非空,且v和v1相等,就表明这个朋友圈里的首脑都来齐了,第一种情况。如果v>v1,自然就是第二种情况,这几个首脑认识,但还有认识的人没进圈。
代码如下:
#include <iostream> #include <vector> #include <algorithm> #include <map> using namespace std; vector<int> head[210]; int G[210][210]; int n,m; int main(){ cin>>n>>m; int t1,t2; fill(G[0],G[0]+210*210,0); for(int i=0;i<m;i++){ cin>>t1>>t2; G[t1][t2]=1; G[t2][t1]=1; head[t1].push_back(t2); head[t2].push_back(t1); } int k; cin>>k; int l,tmp,minnum;; for(int i=0;i<k;i++){ cin>>l; vector<int> v1; for(int j=0;j<l;j++){ cin>>tmp; v1.push_back(tmp); } vector<int> v; for(int j=1;j<=n;j++){ int flag2=0; for(int u=0;u<l;u++){ if(v1[u]!=j){ if(G[v1[u]][j]!=1||G[j][v1[u]]!=1){ flag2=1; break; } } } if(flag2==0)v.push_back(j); } if(v.empty())printf("Area %d needs help.",i+1); else{ sort(v1.begin(),v1.end()); if(v==v1){ printf("Area %d is OK.\n",i+1); } else { for(int j=0;j<v.size();j++){ if(find(v1.begin(),v1.end(),v[j])==v1.end()){ minnum=v[j]; break; } } printf("Area %d may invite more people, such as %d.\n",i+1,minnum); } } } return 0; }

浙公网安备 33010602011771号