鱼与熊掌
《孟子 · 告子上》有名言:“鱼,我所欲也,熊掌,亦我所欲也;二者不可得兼,舍鱼而取熊掌者也。”
先保存每个人所拥有的物品种类编号,记录下后续需要计数
接下来输入一对物品种类编号,遍历所有人,计数即可
使用C++的STL即可
代码如下:
#include<iostream>
#include<unordered_set>
#include<vector>
using namespace std;
struct node
{
int x, y;
};
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); //不加容易超时
int n, m;
cin >> n >> m;
vector<unordered_set<int>> vec(n);
for (int i = 0; i < n; i++)
{
int k, a;
cin >> k;
for (int j = 0; j < k; j++)
{
cin >> a;
vec[i].insert(a);
}
}
cin >> m;
//1.
// for (int i = 0; i < m; i++)
// {
// int a, b,num=0;
// cin >> a >> b;
// for (int i = 0; i < n; i++)
// if (vec[i].find(a) != vec[i].end() && vec[i].find(b) != vec[i].end())
// num++;
// cout << num << "\n";
// }
//2.
node arry[100];
int ans[100];
for (int i = 0; i < m; i++)
ans[i] = 0;
for (int i = 0; i < m; i++)
cin >> arry[i].x >> arry[i].y;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (vec[i].find(arry[j].x) != vec[i].end() && vec[i].find(arry[j].y) != vec[i].end())
ans[j]++;
for (int j = 0; j < m; j++)
cout << ans[j] << "\n";
return 0;
}
代码也是写了两种方式,顺序不同而已,没什么思路上的差距。
满树的遍历
输入每个结点的父结点,同时看看哪个是root,记录下来,并且把每个结点下的子节点保存起来,具体怎么保存,看代码!
然后去查看一下他们的度是否一致,根节点除外(根节点度就是0),度不是零就一定是同一个数
如果不是 输出no 否则输出yes
然后去前序遍历一下就好了,具体执行看代码。
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>> v;
void dfs(int x)
{
if(v[x].size()==0)return;
for(auto i:v[x])
{
cout<<" "<<i;
dfs(i);
}
}
int main()
{
int n;
cin>>n;
v.resize(n+1);
int root=0;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
if(a==0)
root=i;
v[a].push_back(i);
}
int du=v[root].size();
bool pl=true;
for(int i=1;i<=n;i++)
if(v[i].size()!=0&&v[i].size()!=du)
{
pl=false;
if(v[i].size()>du)
du=v[i].size();
}
cout<<du<<" ";
if(pl)
cout<<"yes\n";
else
cout<<"no\n";
cout<<root;
dfs(root);
return 0;
}
大家不懂多多评论区交流,互相请教互相帮助,没准别人一句话就点通你(亲身经历)
期待和大家共同加油,希望大家不断进步!