Hack:
```python3
n = 100000 
print(n)
for i in range(1, n + 1): 
    k = 2 
    p = [min(n, n + 2 - i), max(1, n - i)] 
    print(k, *p) 
```
本题大致题意是,给出打击柱子数量即打击次数,然后给出每次打击中可能的目标对象,然后确定一个合理的打击序列,这让我们想到了基于二分图匹配的匈牙利算法:确定一个元素的匹配值,如果匹配值已经有其他元素占领,那么让占领此匹配值的元素换一个匹配值,最终达到一个合理的匹配。代码如下:#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;}如果不太明白此算法,可以找匈牙利算法的相关知识
点赞 2
评论 3
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务