外星密码

【问题描述】
小 W 潜入了外星人的基地刺探情报,遇到一个二级密码系统。一级密码是一个长度为
n 的 0-1 序列 B, 记为(b1 b2 ⋯ bn)。 将一级密码的第一位放到最后,得到一个新的序
列(b2 b3 ⋯ b1), 继续做同样的操作得到(b3 b4 ⋯ b2),如此反复,总共可以得到
n 个序列,将这些序列按字典序排序后,字典序最小的即为二级密码,输入这个二级密
码,就可以得到情报。
外星人将领将排序过后的 n 个字符串按照字典序从小到大的顺序逐行写成了一个 n 阶
矩阵,而且小 W 恰好看到了这个矩阵,不难发现,这个矩阵的第一行就是二级密码,所以
如果小 W 记住这个矩阵的第一行,就可以直接获得情报。但是小 W 在出发前听上司布置
任务时走神将“记住第一行”听成了“记住最后一列”。所以小 W 现在只记得最后一列是
什么,小 W 赶紧联系远在地球的你,希望你能帮他由矩阵的最后一列得到矩阵的第一行。
【输入格式】
共两行,第一行一个整数 n,第二行 n 个值为 0 或 1 的整数,表示矩阵的最后一列。
【输出格式】
输出文件共一行,为矩阵的第一行。
【样例】
5
1 1 0 0 0
0 0 1 0 1
【数据规模与约定】
对于 20%的测试数据n ≤ 20
对于 50%的测试数据 n≤ 1000
对于 100%的测试数据n ≤ 10000
【样例解释】
一级密码为(0 1 0 0 1),因此得到 5 个序列为:
( 0 1 0 0 1
1 0 0 1 0
0 0 1 0 1
0 1 0 1 0
1 0 1 0 0 ) , 经过排序过后的矩阵为:
( 0 0 1 0 1
0 1 0 0 1
0 1 0 1 0
1 0 0 1 0
1 0 1 0 0 ) ,
第一行为(0 0 1 0 1)。


这道题我当时是没有完成的,我只完成了暴力20分。
正解是极其难以想到,反正我是没想到。

首先可以观察发现,最左边上面一定全是0,下面一定有与最后一列的1的个数相同个数的1
如下可见第一列与最后一列的关系(样例中的)

0 1
0 1
0 0
1 0
1 0
先假设第一行为
0 a b c 1
则左移之后变为
a b c 1 0

不难发现,此时末尾为0,证明过程略(不会),粗略的理解一下
举个例子:

    0 1 0 1 1 1
    0 1 1 1 0 1
    1 0 1 0 1 1
    1 0 1 1 1 0
    1 1 0 1 0 1
    1 1 1 0 1 0     

第一行移动后 : 1 0 1 1 1 0
第二行移动后: 1 1 1 0 1 0

那么必然的,排序后第一行移动的0在第二行的前面(在最后一列的顺序中)。

故可以粗略地得出,第一列与最后一列中的对应规则:

第一列的第n个0对应最后一列的第n个0
第一列的第n个1对应最后一列的第n个1

由此,来依次确定a、b、c的值。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int a[10005],n,Tot,Done,Key[2][10005];
void Find(int Aim,int Num) {
    if(Done == n){
        return;
    }
    if(Done) {
        printf(" ");
    }
    Done++;
    printf("%d",Aim);
    if(Key[Aim][Num] <= n - Tot) {
        Find(0,Key[Aim][Num]);
    } else {
        Find(1,Tot - (n - Key[Aim][Num]));
    }
}
int main() {
    scanf("%d",&n);
    for(int i = 1; i<=n; i++) {
        scanf("%d",&a[i]);
        Tot += a[i];
        if(a[i]) {
            Key[1][Tot] = i;
        } else {
            Key[0][i - Tot] = i;
        }
    }
    if(Tot == n) {
        for(int i = 1; i<=n; i++) {
            if(i != 1) {
                printf(" ");
            }
            printf("1");
        }
        return 0;
    }
    Find(0,1);
    return 0;
}
安装 CentOS 7 到外星人笔记本电脑的过程与在大多数其他设备上类似,但需要考虑兼容性和硬件驱动的问题。下面是一般的步骤指南: ### 准备阶段 1. **检查系统兼容性**:首先确认你的笔记本型号是否支持 Linux 操作系统,并确保你的硬件设备能够正常工作,比如无线网卡、摄像头等。 2. **下载镜像文件**:从 CentOS 官方网站下载适合你的系统的 ISO 镜像文件。通常推荐下载最新版本,以便获得最新的安全更新和支持。 - 访问网址:https://www.centos.org/download/ 3. **创建启动盘**:你需要一个 USB 盘作为安装介质。可以使用 Rufus 或者 Unetbootin 等工具将 ISO 镜像制作成启动盘。 4. **备份数据**:在开始安装之前,请确保备份所有重要数据,以防安装过程中出现问题导致数据丢失。 5. **检查 BIOS 设置**:进入 BIOS 并设置 UEFI 启动优先级,确保可以从 U 盘引导系统。 ### 实际安装过程 1. **重启并进入BIOS设置**:关机后按下特定键(通常是 F2、F10 或 Delete)进入 BIOS 设置界面。 2. **选择U盘作为启动介质**:找到“Boot”或“启动顺序”的选项,选择你的 U 盘为第一启动设备。 3. **保存并退出**:按照提示保存设置并退出 BIOS。 4. **开机并运行安装向导**:重新启动计算机,此时应该会从 U 盘加载 CentOS 的安装程序。按照屏幕上的指示,通过图形化界面或者命令行完成安装。 5. **分区与格式化磁盘**:根据需要选择分区方案,一般建议使用 LVM(Logical Volume Management)或者 GPT 分区表。 6. **选择语言与时间设置**:根据个人偏好设置语言环境和区域设置。 7. **选择软件源**:选择官方的 CentOS 软件仓库或者其他合适的软件库。 8. **自定义安装配置**:可以选择安装桌面环境或其他组件,根据需求定制操作系统。 9. **等待安装完成**:安装过程中可能会有一些初始化步骤和软件包的安装,耐心等待即可。 10. **登录新系统**:安装完成后,首次登录时会要求创建用户账号并设置密码。 ### 使用与维护 1. **安装必要的驱动**:对于特殊的硬件,可能需要手动查找并安装适当的驱动程序。 2. **更新与维护**:安装好系统后,定期访问官方文档或社区论坛了解新的安全更新、补丁和驱动程序信息,保持系统的安全性与稳定性。 3. **学习资源**:CentOS 提供了丰富的在线文档和教程,可以帮助你更深入地学习如何管理和使用这个系统。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值