本题大致题意是,给出打击柱子数量即打击次数,然后给出每次打击中可能的目标对象,然后确定一个合理的打击序列,这让我们想到了基于二分图匹配的匈牙利算法:确定一个元素的匹配值,如果匹配值已经有其他元素占领,那么让占领此匹配值的元素换一个匹配值,最终达到一个合理的匹配。代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N][3];
int e[N<<1],ne[N<<1],h[N],idx,match[N<<1];
bool st[N];
void add(int a,int b)//链式前向星存图
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int u)
{
    for(int i=h[u];~i;i=ne[i])//找邻接点
    {
        int j=e[i];
        if(st[j])continue;//已经被访问
        st[j]=true;
        if(!match[j]||dfs(match[j]))//未匹配或者可以让已经占领此柱子的元素换一个匹配值
        {
            match[j]=u;
            return true;
        }
    }
    return false;
}
int main()
{
    int n;
    cin>>n;
    memset(h,-1,sizeof h);
    for(int i=1;i<=n;i++)
    {
        int k;
        cin>>k;
        for(int j=1;j<=k;j++)
        {
            int w;
            cin>>w;
            add(w,i);   //柱子w可以在第i次打
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
         memset(st,false,sizeof st);//每次都要把标记数组复原
        if(dfs(i))ans++;//记录匹配数量
    }
    if(ans!=n)//只有匹配数量为n时,才能有合理的匹配的结果
    {
        puts("kou is angry");
        return 0;
    }
    for(int i=1;i<=n;i++)cout<<match[i]<<" ";
    return 0;
}

如果不太明白此算法,可以找匈牙利算法的相关知识