[C/C++]买房 - 2019校招编程刷题

[C/C++]买房 - 2019校招编程刷题

参考链接
题目描述
你在玩一个回合制角色扮演的游戏。现在你在准备在一条街上有n幢房子,标号从1到n,两个在标号上相差为1的房子视为相邻,这些房子中有k幢房子已有住户。
现你准备搬入这条街,你能搬入一幢房子的条件是这幢房子没有人住在里面,与此同时由于你非常热爱与邻居进行交流,故而你需要你所入住的房子两边上都有住户。
现要你求最小的可能符合要求的房子数,以及最大的可能符合要求的房子数。

Note: 就样例来说,#代表已有住户,-代表空位,这种情况(###—),没有满足条件的房子,为最小,故输出0
最大的情况为(#-#-#-),此种情况有二个位置满足条件,为最大,故输出2
输入描述

输入的一行为测试用例数t(1 <= t <= 200000),

接下来t行,每行含两个整数n和k,(1 <= n <= 1,000,000,000,0 <= k <= n)

输出描述

对于每个用例输出最小的可能数以及最大的可能数

输入例子1:

6
1 0
1 1
2 0
2 1
2 2
6 4

输出例子1:

0 0
0 0
0 0
0 0
0 0
0 2

思路

  • 找规律的题目,把n和k的结果列出来就知道该怎么做了。
  • 最小值都是0。
  • 最大值列表如下:
  • 可以找到规律,最大值都是在数列的中间两位。经过思考,最大值应该为min(n-k,k-1)
n\k1234567
10
200
3010
40110
501210
6012210
70123210

Just show my code


代码(c++/c)

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
  int t; // 测试用例数量
  cin >>t; 
  int n,k; // 房子数量,已经住人的房子数量
  int max; // 最小可能数量和最大可能数量
  int *p =  new int[t]; // 存储结果
  for(int i = 0 ; i< t ; i++){
    max = 0;
    cin >> n >> k;
    if(k >= 2 && n > k){
      max = min(k-1,n-k);
    }
    p[i] = max;
    
  }
  for(int i = 0 ; i< t ; i++){
   cout<<"0 "<<p[i]<<endl; 
  }
  return 0;
}

如果我的文章能帮你节约20秒,就请你为我的文章点个赞吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值