江晚暮迟 level
获赞
2
粉丝
1
关注
1
看过 TA
30
厦门大学
2025
Java
IP属地:福建
暂未填写个人简介
私信
关注
10-15 22:44
厦门大学 Java
数组 a[n],每次+-交替测试用例数组 {1, 2, 3, 4}1+2, 2-3, 3+4:  {3, -1, 7}3-(-1), -1+7: {4, 6}4-6: {2}我们抽象出一个数组{a,b,c,d}起始我们的矩阵是1000010000100001然后经过一轮的加减加1 1 0 00 1 -1 00 0 1 1第三轮1 0 1 00 1 0 1最后一轮1 -1 1 -1规律不太够,也不知道这样暴力迭代矩阵能不能过但有一个优化思路我们再对5 *5的矩阵做规律观察1000001000001000001000001->1 1 0 0 00 1 -1 0 00 0 1 1 00 0 0 1 -1->1 2 -1 0 00 1 2 -1 00 0 1 2 -1->1 3 1 -1 00 1 3 1 -1->1 0 2 0 1我们发现从第三轮开始,每一轮的矩阵有很强的重复性,所以可能可以在这上面优化当然如果迭代完能ac那可以不考虑这层优化以下矩阵计算代码int n; cin>>n;    vector> matrix(n,vector(n,0));           //初始化成一个单位矩阵    for(int i = 0;i        matrix[i][i] = 1;    //加减交替滚动计算矩阵    //第一行加第二行,第二行减第三行    bool flag = true;    while(matrix.size() != 1){        for(int i = 0;i             for(int j = 0;j                if(flag) {                    matrix[i][j] += matrix[i + 1][j];                }                else{                    matrix[i][j] -= matrix[i+1][j];                }             }            flag == true? flag = false:flag = true;        }        matrix.pop_back();    }    for(int i = 0;i        cout    }
投递百度等公司10个岗位
0 点赞 评论 收藏
分享
10-15 21:11
厦门大学 Java
百度麻将笔试 10.15 题解后端卷第一题 贪心n选k 如果选择的数的下一个数没被选,积分+1所以最后一个数一定能拿一分,而在 n/2的转折处1 (2) 3 (4) 5 (6)(n = 6, k = 3) 可以拿三分k = 4 时(1) (2) 3 (4) 5 (6) 仍然可以拿三分,也就是选择了这个1 不会得分但也不会丢分然后注意数字范围取long long while(t --){        long long int n;        long long int k; cin>>n>>k;        //n个数里最多可以得n/2 ……        //1 - n里假如 n 是奇数 1,2,3可以选2两个数        //假如是偶数那可以选        long long int res = 0;        if(n % 2 == 1) res = n/2 + 1;        else res = n/2;        //到这里是最多能拿多少分,之后每选一个还得扣        if(k         else{            long long int tmp = n + 1;            cout        }    }第二题 约瑟夫环问题注意到每一次选择一个数,都能确定下来结果的一位数比如 1 2 3 4第一次1到队尾,我们就能确定2是结果里的第一位,并且每一次都能确定下来一位所以本质是约瑟夫环问题代码就不放了,我是用队列模拟的第三题 麻将想了半天dp想不出来,那就搜索一下试试,刚好过了——————//dp想破头想不出来//试一下搜索//广度优先搜索//每一轮找刻子或者顺子//然后四轮后找雀头//找得到就res ++//数据量应该支持//哈希表记录一下stringunordered_set uset;void dfs(vector &v,int round){    if(round == 4){        for(int i = 0;i if(v[i] >= 2){                v[i] -=2;                string tmp;                for(int j = 0;j                     tmp.push_back(v[j] + '0');                    tmp.push_back(j + '0');                }                v[i] += 2;                uset.insert(tmp);            }        }        return;    }    //dfs    //先搜刻子,再搜顺子    for(int i = 0;i if(v[i] >= 3){            v[i] -= 3;            dfs(v, round + 1);            v[i] += 3;        }    }    for(int i = 1;i  if(v[i-1] >= 1 && v[i] >= 1 && v[i + 1] >= 1){            v[i - 1] --;            v[i] --;            v[i + 1] --;            dfs(v,round + 1);            v[i - 1] ++;            v[i] ++;            v[i + 1] ++;        }    }}int main() {    int n; cin>>n;    if(n     else{        vector vo(n);        fill(vo.begin(),vo.end(),4);        dfs(vo, 0);        cout    }    }
投递百度等公司10个岗位
0 点赞 评论 收藏
分享
09-19 17:44
厦门大学 Java
第一题dp,第一次卡在中间dp过程要取最大值,第二次卡在数组大小宽度要设置成1000```c++#include #include #include #include using namespace std;int main(){    int t; cin>>t;    const int N = 505;    const int B = 1005;    while (t--)    {        int arr[N];         int box,num,single; cin>>box>>num>>single;        for(int i =1;i        { cin>>arr[i];        } if(single>=box)        {            cout            continue;        }        //cal        bool dp[N][B];        for(int i = 0;i        dp[0][i]=0;        //只有num个物品        //dp[a][b]表示选择装了前a个东西能塞满b个空间        //2 3 5 7        //dp[0][...]=0        //dp[1][01]=0,dp[1][2]=1,dp[1][3]...=0        //dp[2][01]=dp[01],dp[2][2]=1,dp[2][3]=1,dp[2][4]=0(从dp[1][1]转移过来,为0)dp[2][5]=1()        for(int i = 1;i        {            for(int j = 0;j            {                //如果放不下,就复制                //放得下,dp[i][j]=dp[i-1][j-arr[i]] if(arr[i]>j)dp[i][j]=dp[i-1][j];                else if(arr[i]==j) dp[i][j]=1;                else if(arr[i]                //要么放进去,要么不放进去                dp[i][j]=max(dp[i-1][j-arr[i]],dp[i-1][j]);            }        }        bool res=false;        //只要满足[box-single,box]的区间就能装满 for(int i = box;i>=box-single;i--)        {            if(dp[num][i]==true)res=true;        }        if(res)cout        else cout    }        return 0;}```第二题贪心,每一次往前看的时候如果是升序序列就选符合条件下尽量小的,反之亦然```c++#include #include #include #include using namespace std;const int N = 1e5+10;int arr[N];int brr[N];int main(){    int n; cin>>n;    while(n--)    {        int size; cin>>size;        for(int i=0;i        {            scanf("%d",&arr[i]);        }        for(int i=0;i        {            scanf("%d",&brr[i]);        }        int res1=true;        //升序和降序都试一次,每一次选择符合条件的且        //升序的时候更小的,降序的时候更大的        int cur =0;        cur = min(arr[0],brr[0]);        for(int i = 1;i        {            int a = arr[i];            int b = brr[i]; if(a>=cur && b>=cur)            {                cur = min(a,b);            }            else if(a            {                res1 = false;                break;            }            else            {                cur = max(a,b);            }        }        bool res2=true;        int cur2 =0;        cur2 = max(arr[0],brr[0]);        for(int i = 1;i        {            int a = arr[i];            int b = brr[i];            if(a            {                cur2 = max(a,b);            } else if(a>cur2 && b>cur2)            {                res2 = false;                break;            }            else            {                cur2 = min(a,b);            }        }        if(res1||res2)cout        else cout    }    return 0;}```
投递小米集团等公司10个岗位
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务