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