hwf有一套卡组,一共有 n 张不同的卡片,编号从 1 到 n,每张卡片都是一只效果怪兽。
编号为 i 的卡片的效果是:当编号 ai 的卡片在场上时,可以把手中的这张卡片特殊召唤到场上。
现在有 m 次互相独立的询问,对于每次询问:
hwf会从卡组中抽取 5 张卡片作为手卡。
在每次询问的开始,他可以选择手中的某一张卡片无条件召唤到场上,其他的手卡只能由卡片的效果特殊召唤上场。
每次询问开始时,场上没有卡片。
求他每次最多能召唤出多少张卡片?
输入数据
第一行为一个整数n,代表卡组中卡的数量(5≤n≤60)。
第二行有n个整数a1,a2...an,代表第i张怪兽可以在怪兽ai在场时特殊召唤到场上。(1≤ai≤n)。
第三行为一个整数m,代表询问次数(1≤m≤100)。
接下来每行有五个整数,b1,b2,b3,b4,b5(1≤bi≤n)代表手中的怪兽卡的编号。
输出数据
一共m 行
每行输出一个整数,代表每次询问中最多召唤出的怪兽数量。
样例输入
5
1 1 1 1 1
1
1 2 3 4 5
样例输出
5
#include <iostream>
#include<string.h>
//#include<bits/stdc++.h>
#include <algorithm>
using namespace std;
#define max(a,b) a>b?a:b
bool panduan (int a[],int b)
{
for(int i=0;i<5;i++)
{
if(a[i]==b)
{
return true;}
}
return false;
}
/*bool cv(int a[],int b[],int c)
{
for(int i=0;i<5;i++)
}*/
int main(){
int n, m;
int y[5];
int a[100], b[5], call[100] = {0};
bool choose[100] = {0};
cin >> n;
for( int i = 1; i <= n; i++ )//
cin>> a[i];
cin >> m;
for( int i = 0; i < m; i++ ){
//memset(choose, false, 100);
// memset(call, 0, 100);
for(int j = 0; j < 5; j++){
cin >> b[j];
y[j]=0;
// choose[b[j]] = true;
}
int max=1;
for(int j = 0; j < 5; j++){
int temp = b[j];
// memset(y,0,5);
int s=0;
while(panduan(b,a[temp]))
{ int flag=0;
for(int k=0;k<5;k++)
{
if(a[b[k]]==a[temp])
{
if(b[k]==a[temp])
{
flag=1;
}
s++;}
}
if(a[temp]==temp||flag==1)
{
//s++;
break;
}
s++;
temp=a[temp];
}
if(max<s)
max=s;
}
cout << max << endl;
}
return 0;
}