[2021.11.14]UPC-计算机2021随堂测验第四场-21234 Problem G 买房子

该博客探讨了一种数学问题,涉及在n个套房中找出好房子的数量,好房子定义为至少有一个相邻的已住人房子。通过分析不同情况,博主提出当k小于等于n/3时,采用特定的贪心策略,使得好房子数量最大化;而当k大于n/3时,好房子数量会随着每新增一个住户减少。博主提供了输入输出示例和解决方案代码,解释了如何确定最少和最多的好房子数量。

马克思姆想要在一座大房子里面买一套公寓套房,已知有n个套房排成一排,其中有k套房已经被人住了。马克思姆喜欢串门,所以他想要住旁边有人住的房子。我们规定一套房子如果是好房子,那么相邻的房子中至少有一个房子已经有了人住了。但是马克思姆只知道有k个房子有人住了,他并不知道具体哪k个房子住了人。帮助马克思姆算出最少有几个好房子,最多有几个好房子。

输入

两个整数n,k (1<=n<=109,0<=k<=n)

输出

输出两个整数,分别表示最少有几个好房子,最多有几个好房子。

样例输入 Copy

6 3

样例输出 Copy

1 3

题解

该题其实有一点贪心算法的感觉。

要分为两类讨论,

当 k<=n/3时,我们可以采取最优放法,让每个住人的房子旁边的房子都是空房子,好房子数为k*2。

当k>n/3时,最优放法放完之后,每再住一个人,好房子就要减少一个,所以好房子数为(n/3*2)-(k-n/3)化简可得 好房子数为n-k。

要注意 k为0的特殊情况

#include <cstdio>
int main() {
    int n,k;
    scanf("%d %d",&n,&k);
    if(!k||k==n){
        printf("0 0");
        return 0;
    }
    else
        printf("1 ");
    if(k<=n/3){
        printf("%d",k*2);
    }
    else{
        printf("%d",n-k);
    }
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值