CF349B Color the fence-20140208

本文通过实例解析贪心算法在解决涂栅栏问题中的应用,详细讲解了算法思路、实现步骤以及代码实现,旨在帮助读者理解并掌握此类问题的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

  

Color the fence

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

Tom has fallen in love with Mary. Now Tom wants to show his love and write a number on the fence opposite to 

Mary’s house. Tom thinks that the larger the numbers is, the more chance to win Mary’s heart he has.

Unfortunately, Tom could only get V liters paint. He did the math and concluded that digit i requires ai liters paint. 

Besides,Tom heard that Mary doesn’t like zero.That’s why Tom won’t use them in his number.

Help Tom find the maximum number he can write on the fence.

输入
There are multiple test cases.
Each case the first line contains a nonnegative integer V(0≤V≤10^6).
The second line contains nine positive integers a1,a2,……,a9(1≤ai≤10^5).
输出
Printf the maximum number Tom can write on the fence. If he has too little paint for any digit, print -1.
样例输入
55 4 3 2 1 2 3 4 529 11 1 12 5 8 9 10 6

    

解题报告

典型的贪心算法即可解决问题。

先取最大长度,再分别取每位上的最大值。

代码

#include <iostream>
#include <stdio.h>

/*贪心算法*/

using namespace std;
int main()
{
    long a[9],minnmum=100005,v,rest,times,mtimes;
        while(~scanf("%d\n",&v))
    {
        minnmum=100005;
        for(int i=0;i<9;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]<=minnmum)
                {
                minnmum=a[i];
                mtimes=i;
                }//取得最小值和最小下标
        }
        rest=v%minnmum;//取得最大字长下拉伸区间
        times=v/minnmum;//取得最大字长
        if(v<minnmum)
        {
            printf("-1\n");
            continue;
        }
        while(times!=0)
        {
           for(int o=8;o>=mtimes;o--)
               {int t = (v-a[o])/minnmum;
                if(t>=times-1&&v>=a[o])
                {
                    printf("%d",o+1);
                    times--;
                    v-=a[o];
                    break;
                }
            //找最大值*/
               }
        }
        printf("\n");
    }
}




<think>嗯,用户现在问的是关于在Linux上安装和配置高可用性集群相关软件包的命令:yum install -y corosync pacemaker pcs fence-agents fence-virt corosync-qdevice sbd。我需要先理解这个命令中的每个软件包的作用,以及用户可能的背景和使用场景。 首先,用户可能是在搭建一个高可用性集群,比如用于Web服务器、数据库或者虚拟化环境。他们可能是一个系统管理员或者DevOps工程师,负责确保服务的高可用性。命令中的每个包都是集群的关键组件,所以需要逐一解释。 corosync是集群通信层,负责节点间的消息传递和成员管理。pacemaker是资源管理器,负责监控和迁移服务资源。pcs是配置工具,用来管理集群配置。fence-agents和fence-virt用于STONITH(Shoot The Other Node In The Head),防止脑裂问题。corosync-qdevice提供仲裁设备支持,确保集群在节点数偶数时也能正确决策。sbd是STONITH的块设备,用于节点隔离。 接下来,需要分析用户可能的需求。他们可能正在设置一个新的集群,或者扩展现有集群的功能。用户可能对高可用性集群有一定的了解,但需要确认各个组件的用途和安装后的配置步骤。需要确保用户明白这些包的作用,以及安装后的下一步操作,比如配置Corosync、Pacemaker,设置STONITH设备,配置仲裁设备等。 另外,用户可能是在CentOS或RHEL系统上操作,因为使用的是yum命令。需要注意不同版本的软件包可能有差异,尤其是RHEL和CentOS的版本兼容性。同时,用户可能需要指导如何启用必要的仓库,比如High Availability或Resilient Storage仓库,如果这些软件包不在默认仓库中。 用户可能没有明确说出他们的最终目标,但根据安装的软件包,可以推测他们需要一个稳定可靠的集群环境,可能用于生产环境。因此,在回答时需要强调配置的最佳实践,比如正确配置STONITH,避免脑裂,使用仲裁设备提高集群可靠性,以及SBD的配置注意事项。 在解释每个包的时候,要简明扼要,同时提供足够的背景信息,让用户理解为什么需要安装这些包。例如,解释fence-agents和fence-virt的区别,前者是通用的fencing代理,后者是针对虚拟化环境(如KVM)的代理。同样,corosync-qdevice用于跨站点的集群仲裁,而sbd则是一种基于共享存储的隔离机制。 还需要注意用户可能的误区,比如安装完软件包后直接启动服务而没有正确配置,导致集群无法正常工作。因此,在回答中可以简要提到安装后的初始步骤,如使用pcs命令进行集群初始化,配置认证,启动服务等,但不需要太详细,因为用户当前的问题是关于安装命令的。 最后,确保回答结构清晰,分点解释每个软件包,并总结它们如何共同工作来构建高可用集群。可能还需要提到参考资料或官方文档链接,方便用户进一步学习。以下</think>是在 Linux 系统中使用 `yum install -y corosync pacemaker pcs fence-agents fence-virt corosync-qdevice sbd` 命令安装的软件包及其作用的详细介绍。这些工具共同构成了一个完整的 **高可用性(HA)集群解决方案**,适用于构建企业级容灾系统。 --- ### **各软件包功能说明** #### **1. `corosync`** - **作用**:集群通信引擎,负责节点间的心跳检测、状态同步和消息传递。 - **关键特性**: - 通过多播(Multicast)或单播(Unicast)实现节点间通信。 - 维护集群成员关系,检测节点故障或网络分区。 - 与 Pacemaker 配合,构成高可用集群的基础层。 #### **2. `pacemaker`** - **作用**:集群资源管理器,负责监控服务状态、执行故障转移和资源调度。 - **关键特性**: - 管理资源(如虚拟 IP、数据库、Web 服务)的启动、停止和迁移。 - 支持复杂的资源约束(如依赖关系、启动顺序)。 - 提供脑裂(Split-Brain)防护机制(需配合 STONITH)。 #### **3. `pcs`** - **作用**:Pacemaker/Corosync 的配置工具,用于简化集群的创建和管理。 - **常用命令**: - `pcs cluster setup`:初始化集群。 - `pcs resource create`:定义集群资源。 - `pcs constraint`:设置资源约束规则。 #### **4. `fence-agents` 与 `fence-virt`** - **作用**:实现 STONITH(Shoot The Other Node In The Head)机制,用于在节点故障时强制隔离(断电或关闭)故障节点,防止脑裂。 - **分类**: - `fence-agents`:通用隔离代理(如 IPMI、iLO、AWS/Azure 云平台接口)。 - `fence-virt`:专为虚拟化环境(如 KVM/QEMU)设计的隔离代理,通过 `libvirt` 控制虚拟机。 #### **5. `corosync-qdevice`** - **作用**:提供 **仲裁设备(QDevice)** 支持,用于在集群节点数为偶数时,通过外部仲裁设备(如专用服务器或虚拟机)决定集群的活跃分区,避免脑裂。 - **典型场景**:跨数据中心的双活集群,或节点数偶数的集群。 #### **6. `sbd`** - **作用**:STONITH Block Device,基于共享存储(如 SAN/iSCSI)的节点隔离机制。通过向共享磁盘写入“毒药包”(Poison Pill),触发节点自隔离。 - **优势**:在网络隔离场景下仍能可靠隔离节点,常用于无硬件电源控制(IPMI)的环境。 --- ### **典型应用场景** - **虚拟化高可用**:在 KVM 环境中,若宿主机故障,自动将虚拟机迁移到其他节点。 - **数据库主从切换**:如 MySQL、PostgreSQL 的主库故障时自动切换至备库。 - **Web 服务容灾**:通过虚拟 IP(VIP)在节点间漂移,保障服务持续可用。 --- ### **安装后的关键配置步骤** 1. **初始化集群**: ```bash pcs cluster auth node1 node2 # 节点间认证 pcs cluster setup --name my_cluster node1 node2 # 创建集群 pcs cluster start --all # 启动所有节点 ``` 2. **配置 STONITH**(以 KVM 为例): ```bash pcs stonith create my_fence fence_virt pcmk_host_list="node1 node2" pcs property set stonith-enabled=true ``` 3. **配置仲裁设备**(可选): ```bash corosync-qdevice-nettool setup -i # 初始化 qdevice pcs quorum device add model net host=仲裁设备IP ``` 4. **配置 SBD**(需先准备共享存储): ```bash sbd -d /dev/sdb create # 初始化 SBD 设备 sbd -d /dev/sdb allocate node1 # 为节点分配槽位 ``` 5. **添加集群资源**(示例:虚拟 IP 和 Apache 服务): ```bash pcs resource create WebVIP ocf:heartbeat:IPaddr2 ip=192.168.1.100 pcs resource create WebService ocf:heartbeat:apache pcs constraint colocation add WebService with WebVIP INFINITY ``` --- ### **注意事项** 1. **网络配置**:确保节点间通信使用专用网络(如心跳网络),避免与业务流量冲突。 2. **STONITH 必须启用**:未配置隔离机制的集群可能因脑裂导致数据损坏。 3. **测试故障场景**:通过 `pcs cluster stop` 或手动触发故障,验证自动恢复是否生效。 4. **版本兼容性**:RHEL/CentOS 7/8/9 的 Pacemaker 配置命令可能略有差异,需参考对应版本文档。 --- ### **总结** 通过安装这些软件包,您可以构建一个支持自动故障转移、资源隔离和脑裂防护的高可用集群。核心组合为: - **通信层**:Corosync - **资源管理**:Pacemaker + pcs - **隔离机制**:fence-agents + sbd - **仲裁支持**:corosync-qdevice 建议参考官方文档进一步学习:[ClusterLabs 官方指南](https://clusterlabs.org/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值