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
这道题应该怎么解,一直A不了,不知道问题在哪儿
#include <iostream>
#include <string.h>
using namespace std;
int main(){
int n;
cin >> n;
int a[65];
for(int i = 1;i <= n;i++){
cin >> a[i]; //存储所有卡片的技能
}
int m;
cin >> m;
int b[105][5];
for(int i = 1;i <= m;i++){
for(int j = 0;j < 5;j++){
cin >> b[i][j]; //存储m组,每组5个的抽到的卡片
}
}
int d[5]; //用来保存放出第i张卡片时最多能够上场的数量
for(int i = 1;i <= m;i++){
memset(d,0,sizeof(d)); //将其原始值置为0
int max = 1; //至少1张牌在场
for(int k = 0;k < 5;k++){
for(int h = 0;h < 5;h++){
if(a[b[i][k]] == b[i][h]){ //判断如果存在技能和手中牌有重合时,总上场牌数增加
d[h]++;
}
if(d[h] > max){
max = d[h];
}
}
}
cout << max << endl;
}
return 0;
}
你没有考虑连续召唤的问题,试试下面这个输入
5
1 1 2 3 4
1
1 2 3 4 5
这就是判断一个多叉树里根节点有几个子节点的问题,输入数据后从每个节点向父节点方向遍历,经过的节点的总召唤数加一。
抽卡时从手牌节点向上遍历,遇到的节点对应的值加一。
#include <iostream>
#include <algorithm>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
int main(){
int n, m;
int a[100], b[5], call[100] = {0};
bool choose[100] = {0};
cin >> n;
for( int i = 0; 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];
choose[b[j]] = true;
}
for(int j = 0; j < 5; j++){
int temp = b[j];
while(a[temp]!=temp && choose[a[temp]]){
call[a[temp]]++;
temp = a[temp];
}
}
int mCall = 0;
for( int j = 0; j < 5; j++ ){
mCall = max(mCall, call[b]);
}
cout << mCall + 1 << endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define inf 0x3f3f3f3f
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define N 500+5
int main()
{
int cas;
RI(cas);
while(cas--)
{
int n;
RI(n);
int hong=0;
int lan=0;
int flag=0;
while(n--)
{
char s[4];
RS(s);int x;RI(x);
if(s[0]=='B')lan+=x;
if(s[0]=='R')hong+=x;
if(s[0]=='G')flag^=x;
}
if(flag)hong++;
if(hong>lan)
printf("YES\n");
else printf("NO\n");
}
return 0;
}