weixin_39115868 2019-09-09 16:20 采纳率: 33.3%
浏览 346
已采纳

这道题为什么A不了,应该用什么算法

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;
}
  • 写回答

2条回答 默认 最新

  • JonathanYan 2019-09-09 18:37
    关注

    你没有考虑连续召唤的问题,试试下面这个输入

    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;
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)