携程9.14笔试

继续没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从大到小螺旋排入吧,这样大的数的相邻数比较多结果也就大,没时间写了也不会写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值