首页 > 其他分享 >[CF1646F] Playing Around the Table 的题解

[CF1646F] Playing Around the Table 的题解

时间:2024-07-12 13:22:21浏览次数:11  
标签:CF1646F 题目 int 题解 构造 cdot Table 传给

题目大意

有 \(n\) 种牌,一种 \(n\) 张,一共 \(n\) 个玩家,一人 \(n\) 个。每个人一次将一张牌对给下家,求构造方案使可以在 \(n\cdot (n-1)\) 次操作之内使第 \(i\) 个人拥有 \(n\) 张 \(i\)。

数据范围满足,\(1\le n\le 100\)。

思路

因为直接构造出题目要求的情况会出现如果一个人提前完成了牌的收集,那么在接下来的操作中他的牌会被打乱,并不足够优秀。

考虑先构造出每一个人都拥有 \(1\) 到 \(n\) 号牌的方案,在使用 \(\dfrac{n\cdot(n-1)}{2}\) 的交换次数交换为题目要求的方案。

现在问题转化为了怎么构造出每一个人都拥有 \(1\) 到 \(n\) 号牌的方案。

如果没有构造出上述的情况,那么一定有一个人拥有重复的牌,将这个牌传给下家。如果这个人手中的牌都没有重复,那么可以它可以将上家传给他的牌传给下家,这样就可以保证手中现在的情况不被破坏。

只考虑值为 \(1\) 的牌需要被往前送多少次。把牌看作 \(1\) ,人看作 \(−1\) ,那么必然存在一个循环移位使得前缀和非负。于是不难发现,在这个循环移位下,每张牌只会往前走,不会从第 \(n\) 个人回到第 \(1\) 个人。

所以这个操作是可以在 \(\dfrac{n\cdot(n-1)}{2}\) 次操作之内完成的。

#include<iostream>
using namespace std;
const int N=105;
int n,a[N][N],ans[N];
int ck(){
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]>1){
        // cout<<"i="<<i<<" j="<<j<<'\n';
        return i;
    }
    return 0;
}
signed main(){
    cin>>n;
    for(int i=1,x;i<=n;i++) for(int j=1;j<=n;j++) cin>>x,a[i][x]++;
    cout<<(n-1)*n<<'\n';
    for(int num=1;num<=(n-1)*n/2;num++){
        int p=ck(),f=1;
        // cout<<"p="<<p<<'\n';
        if(!p){
            for(int i=1;i<=n;i++) cout<<1<<' ';
            cout<<'\n';continue;
        }
        // for(int i=1;i<=n;i++){
        //     for(int j=1;j<=n;j++){
        //         cerr<<a[i][j]<<' ';
        //     }
        //     cerr<<'\n';
        // }
        // cout<<p<<'\n';
        for(int i=p;i!=p||f;i=i%n+1,f=0){
            for(int j=1;j<=n;j++){
                if(a[i][j]>1){
                    a[i][j]--;
                    a[i%n+1][j]++;
                    ans[i]=j;
                    break;
                }
            }
        }
        for(int i=1;i<=n;i++){
            cout<<ans[i]<<' ';
        }
        cout<<'\n';
    }
    
    for(int i=2;i<=n;i++){
        for(int j=1;j<i;j++){
            for(int k=1;k<=n;k++){
                cout<<(i+k-j-1)%n+1<<' ';
            }
            cout<<'\n';
        }
    }
    return 0;
}

标签:CF1646F,题目,int,题解,构造,cdot,Table,传给
From: https://www.cnblogs.com/liudagou/p/18298166

相关文章

  • 2022 RoboCom CAIP(本科组)国赛个人题解
    RC-u1智能红绿灯为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。这个红绿灯是这样设计的:路的两旁设置了一个按钮,老年人希望通行马路时会按下按钮;在没有人按按钮的时候,红绿灯一直为绿灯;当红绿灯为绿灯时,有人按下按钮,第一次按下......
  • CF1992场题解
    OnlyPluses算法:数学。题意简述:有三个数,每次选择一个数\(x\),使得\(x\)增加一,至多操作\(5\)次,最后求出这三个数的乘积最大值。简单题,一眼秒了。考虑把这\(3\)个数从小到大排序,显然加最小的数比加其他的数更优。简单证一下:设排序后的三个数为\(a,b,c\),有\(b\timesc\ge......
  • upload-labs靶场全题解
    ​​靶场搭建对php和apache版本有严格要求,建议使用phpstudy2018并且使用设置php版本为5.2.17,这个靶场比较老了,如果要复现的话,必要严格按照要求来使用,博主使用最新版的phpstudy在某些靶场上未能成功复现,所以浪费了很多时间。。。。。Upload-Labs环境要求操作系统:wind......
  • 2024SCAU暑假集训_1题解(部分,待补充)
    最近我们开始了暑假集训现在我来补一下第一场集训的题解题目题号来源是否写了题解A黑暗爆炸4771否但是放了大佬的链接指路B黑暗爆炸3399已写C洛谷P3231D洛谷P2120ECodeForces197AF洛谷P1732GBZOJ5296H黑暗爆炸1406......
  • 多线程中自定义线程池与shiro导致的权限错乱问题解决
    importorg.apache.shiro.SecurityUtils;importorg.apache.shiro.subject.Subject;importorg.apache.shiro.util.ThreadContext;importjava.util.concurrent.*;publicclassShiroAwareThreadPoolExecutorextendsThreadPoolExecutor{publicShiroAwareThread......
  • Linux创建组和用户groupadd:无法锁定/etc/group问题解决
    问题原因:相关关键文件进行了锁定,不能被访问和修改1.确认是否是使用root用户执行,2.确定文件权限没问题使用lsattr命令查看隐藏权限设定情况[abc@localhost~]$lsattr/etc/group----------------/etc/group[abc@localhost~]$lsattr/etc/passwd----------------/etc/......
  • Codeforces Round #956 (Div. 2)题解
    A.ArrayDivisibility需要让满足$k\midj$的所有\(a_j\)的和整除k,只需要让每个\(a_j\)整除k就可以了,可以让\(a_j=j\)#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'typedefpair<int,int>pii;typedefunsignedlonglo......
  • CF1051F题解
    TheShortestStatement算法:树链剖分,最小生成树,最短路。先讲一下题意:有一个\(n\)点\(m\)边的无向连通图,\(q\)次询问,每次询问\(a\)到\(b\)的最短路长度。数据范围\(1\len,m\le10^5,m-n\le20\)。首先发现给了一个很奇怪的限制:\(m-n\le20\),考虑他有什么用。我们在......
  • 【完结】LeetCode 热题 HOT 100分类+题解+代码详尽指南
    目录LeetCode热题100前言LeetcodeTop100题目和答案-哈希LeetcodeTop100题目和答案-双指针篇LeetcodeTop100题目和答案-滑动窗口篇LeetcodeTop100题目和答案-子串篇LeetcodeTop100题目和答案-普通数组篇LeetcodeTop100题目和答案-矩阵篇LeetcodeTop100题目和......
  • 在Linux中,ptables是否支持time时间控制用户行为,如有请写出具体操作步骤。
    在Linux中,iptables是一个非常强大的防火墙工具,用于配置网络传输相关规则。然而,iptables本身并不支持基于时间的规则控制,也就是说,它不能直接根据时间来控制用户行为或网络流量。iptables的规则是基于包的源地址、目的地址、端口号、协议类型等来决定是否允许或拒绝数据包。但是......