九度OJ 1033
验证3n+1问题
给你n个数,记录每个数到1过程中出现的数字,如果只出现过一次,就输出(逆序的)
思路:set 直接搞,丢进set后,set.count(a[i])==1的就丢进数组里面然后倒着输出就好。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int a[505];
int ans[505];
int main()
{
int n;
while(cin>>n)
{
set<int> s;
s.clear();
if(n==0)
return 0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
int tmp=a[i];
while(tmp!=1)
{
if(tmp&1)
{
tmp=tmp*3+1;
tmp/=2;
s.insert(tmp);
}
else
{
tmp/=2;
s.insert(tmp);
}
}
}
int cnt=0;
for(int i=n;i>=1;i--)
{
if(s.count(a[i])==0)
{
ans[cnt++]=a[i];
}
}
for(int i=0;i<cnt-1;i++)
{
cout<<ans[i]<<" ";
}
cout<<ans[cnt-1]<<endl;
}
return 0;
}
九度OJ 1035
题目1035:找出直系亲属
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2369
解决:929
-
题目描述:
-
如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-。
-
输入:
-
输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题, 然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,如果A的父母亲信息不全,则用-代替,例如A-C,再然后是m行形式如FA的字符串,表示询问F和A的关系。
当n和m为0时结束输入。
-
输出:
-
如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。
具体含义和输出格式参见样例.
-
样例输入:
-
3 2 ABC CDE EFG FA BE 0 0
-
样例输出:
-
great-grandparent -
我的思路:把N个输入当做有向图的边来建图,ABC代表A->B A->C有一条权值为1的边,然后图建好后,floyd跑一遍最短路求出任意两点的距离,m个询问进来后,直接查询a->b或者b->a的权值就好,分分类输出就行了。主要是点少。。。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int dis[105][105];
void floyd()
{
for(int k=1;k<=100;k++)
{
for(int i=1;i<=100;i++)
{
for(int j=1;j<=100;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
string s;
int n,m;
int main()
{
while(cin>>n>>m)
{
if(n==0&&m==0)
return 0;
for(int i=1;i<=100;i++)
{
for(int j=1;j<=100;j++)
{
if(i==j)
{
dis[i][j]=0;
}
else
{
dis[i][j]=9999;
}
}
}
for(int i=1;i<=n;i++)
{
cin>>s;
int a,b,c;
a=s[0];
b=s[1];
c=s[2];
//cout<<a<<"~~"<<b<<"~~"<<endl;
dis[a][b]=dis[a][c]=1;//a是b,c的儿子,代表a->b,a->c有一条有向边
}
floyd();
while(m--)
{
string ss;
cin>>ss;
int a,b;
a=ss[0];
b=ss[1];
int c;
c=min(dis[a][b],dis[b][a]);//看是a->b有边还是b->a有边,选最小的
if(c==9999||c==0)
{
cout<<"-"<<endl;
continue;
}//如果都没有边,或者就是自己本身
if(c==1)
{
if(dis[b][a]==1)
cout<<"parent"<<endl;//b->a则父母
else
cout<<"child"<<endl;//否则儿子
}
else//如果不为1就必然是祖辈的了。
{
if(dis[a][b]!=9999)//a->b去扫
{
c-=2;
for(int i=1;i<=c;i++)
{
cout<<"great-";
}
cout<<"grandchild"<<endl;
}
else//b->a去扫
{
c-=2;
for(int i=1;i<=c;i++)
{
cout<<"great-";
}
cout<<"grandparent"<<endl;
}
}
}
}
return 0;
}
DFS,指针都能要了我的命,能用别的做法做就用别的做法做吧,太纱布了QAQ