L2-030 冰岛人 - 哈希表 + 模拟
思路:
这题和天下兄妹那题很像 都有查找几代之内是否有共同祖先
【PTA-训练day6】L2-016 愿天下有情人都是失散多年的兄妹+ L1-011 帅到没朋友_Roye_ack的博客-CSDN博客
- 用哈希表储存 p[名字][性别][父名字]
- 注意 所谓“五代以内无公共祖先”是指两人的公共祖先(如果存在的话)必须比任何一方的曾祖父辈分高 这句话意思是——
- 包含自己这一代的四代内都不能有共同祖先
- 且 a的四代内不能有b的祖先 b的四代内也不能有a的祖先
- 2个人有相同的祖先,这个祖先是一个人的三代,另一个人的六代,那么他也算是二人的共同祖先
- 因此用双重for循环 当a的四代内都没有b的祖先且b的四代内都没有a的祖先 则ok
#include <bits/stdc++.h>
using namespace std;
typedef pair<char,string> PII;
unordered_map<string,PII> p; //p[名字][性别][父名字]
bool f;
bool ck(string a,string b)
{
int adai=1;
for(string i=a;i.size();i=p[i].second,adai++)
{
int bdai=1;
for(string j=b;j.size();j=p[j].second,bdai++)
{
if(adai>=5&&bdai>=5) return true;
if(i==j) return false;
}
}
}
int main()
{
int n,k;
cin>>n;
while(n--)
{
string a,b;
cin>>a>>b;
if(b.back()=='n') p[a]={'m',b.substr(0,b.size()-4)};
else if(b.back()=='r') p[a]={'f',b.substr(0,b.size()-7)};
else p[a].first=b.back();
}
cin>>k;
while(k--)
{
string a,b,c,d;
cin>>a>>b>>c>>d;
if(!p.count(a)||!p.count(c)) cout<<"NA"<<endl;
else if(p[a].first==p[c].first) cout<<"Whatever"<<endl;
else
{
f=ck(a,c);
if(f) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
}
L1-072 刮刮彩票 - 20 - 简单模拟
#include <bits/stdc++.h>
using namespace std;
int b[25]={0,0,0,0,0,0,10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,3600};
int main()
{
int sum=0,idxi,idxj;
int a[4][4];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
{
cin>>a[i][j];
if(a[i][j]==0) idxi=i,idxj=j;
sum+=a[i][j];
}
a[idxi][idxj]=45-sum;
int t=3;
while(t--)
{
int x,y;
cin>>x>>y;
cout<<a[x][y]<<endl;
}
int q,res=0;
cin>>q;
if(q<4) for(int i=1;i<=3;i++) res+=a[q][i];
else if(q<7) for(int i=1;i<=3;i++) res+=a[i][q-3];
else if(q==7)
{
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++) if(i==j) res+=a[i][j];
}
else
{
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++) if(i+j==4) res+=a[i][j];
}
cout<<b[res];
}
L1-070 吃火锅 - 15
#include <bits/stdc++.h>
using namespace std;
int main()
{
int cnt=0,res=0,idx;
bool f=false;
while(true)
{
string s;
getline(cin,s);
if(s==".") break;
cnt++;
if(s.find("chi1 huo3 guo1")!=-1)
{
res++;
if(!f) idx=cnt;
f=true;
}
}
cout<<cnt<<endl;
if(res==0) cout<<"-_-#";
else cout<<idx<<" "<<res;
}
L1-068 调和平均 - 10
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,t;
double sum=0;
cin>>n;
t=n;
while(t--)
{
double x;
cin>>x;
sum+=1.0/x;
}
printf("%.2f",1.0/(sum/n));
}