[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\k 1 2 3 4 5 6 7
1 0
2 0 0
3 0 1 0
4 0 1 1 0
5 0 1 2 1 0
6 0 1 2 2 1 0
7 0 1 2 3 2 1 0

Just show my code


代码(c++/c)

#include
#include
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秒,就请你为我的文章点个赞吧!

你可能感兴趣的:([C/C++]买房 - 2019校招编程刷题)