继续没offer没意向的一天
携程笔试3/4
第一题
切一个边长n的方形披萨,要求切k刀,并且使得切出来的披萨块面积都相同,而且长和宽的差绝对值要尽量小。
纯纯阅读理解题,就是让你横着切的和竖着切都是平均分的切,根据k是奇数和偶数分情况讨论。
是奇数则:
横着切(k-1)/2刀,得到了k-1)/2 + 1块披萨,所以小披萨块边长为n/((k-1)/2 + 1);竖着切(k+1)/2刀,得到(k+1)/2+1块披萨,宽度n/((k+1)/2+ 1)
偶数同理, 再求个乘积就行了,主要注意变量类型,也学习了一下c++输出保留两位小数写法
#include<bits/stdc++.h>
using namespace std;
int main(){
double n;
double k;
cin >> n>>k;
double length,width;
if(int(k)%2 == 1){
length= float(n/((k-1)/2 + 1));
width = float(n/((k+1)/2 + 1));
}else{
length = float(n/(k/2+1));
width = float(n/(k/2+1));
}
double res = length*width;
cout<<setiosflags(ios::fixed) << setprecision(2)<<res<<endl;
//printf("%.2f",res);
return 0;
}
第二题
/*交换相邻的数字使得01矩阵a变为01矩阵b,先输入一个数代表有几组矩阵,对于每组矩阵给出需要交换几次。
如果不能由a得到b则输出-1
例子:
2
0 1
1 0
1 0
0 1
0 0
0 0
1 1
1 1
输出:
2
-1
*/
笨蛋模拟思路:
先看两个矩阵1的数量相同不相同,不相同直接返回-1,相同的话分类讨论。
根据两个矩阵有几个位置数字不同分为三类:
①0个位置数字不同,也就是俩矩阵a和b是一样的,直接返回0;
②4个位置数字不同,也就是所有位置上的数字都不一样,这时候需要交换两次,没有严谨求证
③2个位置数字不同,这种情况还要再分类讨论,如果是对角线上的两个数字不同那么需要两次,如果不是对角线上的而是相邻的,那么一次就够了。
丑陋代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >>t;
while(t--){
vector<vector<int>> a(2,vector<int>(2,0));
vector<vector<int>> b(2,vector<int>(2,0));
int counta1=0,countb1=0;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
cin >> a[i][j];
if(a[i][j] == 1){
counta1 ++;
}
}
}
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
cin >> b[i][j];
if(b[i][j] == 1){
countb1 ++;
}
}
}
if(counta1!=countb1){
// cout << counta1<<","<<countb1<<endl;
cout <<-1<<endl;
}else{
int temp = 0;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
if(a[i][j] != b[i][j]){
temp++;
}
}
}
if(temp ==2){
pair<int,int> idx1,idx2;
int cur = 0;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
if(a[i][j] != b[i][j] ){
if(cur == 0){
idx1.first =i;
idx1.second = j;
cur ++;
}else{
idx2.first =i;
idx2.second = j;
}
}
}
}
if(idx1.first != idx2.first && idx1.second != idx2.second){
cout << 2<<endl;
}else{
cout <<1<<endl;
}
}else if(temp == 4){
cout << 2<<endl;
}else if(temp == 0){
cout <<0<<endl;
}
}
}
return 0;
}
第三题
题目:
忘了记用例,说个大概。
输入多组测试用例,每个测试用例为:
第一行为一行数字,第二行为数字颜色,R代表红色,B代表蓝色,红色数字可以每次加一,蓝色可以每次减一,操作次数不限,设操作后数组最大值和最小值的差值是res,求res最小是多少。
例子:
1 2 3 4 5
RRBRB
输出:3
差值最小的时候就红蓝各操作一次 是2 3 2 5 4
忘了记代码,主要是思路,先求出来红色那边最大最小数,还有蓝色这边最大最小数,其实只需要分为两种情况,一种是红色最小值大于蓝色最小值,那么红色上移也没用,直接用整个数组最大减最小就行了,其余的所有情况都可以直接输出max(REDMAX-REDMIN,BLUEMAX-BLUEMIN).这样就AC了
第四题
给一个数n,为一个方阵的宽,这个方阵里的数是1~n^2这些数,但是每个数的位置不固定,设矩阵权值和为每个数和他相邻的数的和再相加,求最大的矩阵权值是多少。
例子:
2
输出:20
因为边长是2的话怎么排列都是一样的值
1 2
3 4
(1+2)+(1+3)+(2+4)+(3+4)=20
3
输出:134
我的想法:
可能是将1~n^2从大到小螺旋排入吧,这样大的数的相邻数比较多结果也就大,没时间写了也不会写。