第34次CCF-CSP认证真题解析(目标300分做法)

第34次CCF-CSP认证

矩阵重塑(其一)

输入输出及样例:

AC代码及解析

  • 1.线性化原矩阵 :由于cin的特性我们直接把给定的矩阵按照题目的意思转换成一维数组即可

  • 2.填充新矩阵 :然后对于新的矩阵 我们只需要按照新的规模p*q重新排版即可

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n,m,p,q;
const int N=1e4+10;
int a[N];
int main(){
    cin>>n>>m>>p>>q;
    for(int i=0;i<n*m;i++) cin>>a[i];
    int index=0;
    for(int i=0;i<p;i++){
        for(int j=0;j<q;j++){
            cout<<a[index]<<' ';
            index++;
        }
        cout<<endl;
    }
    return 0;
}

矩阵重塑(其二)

输入输出及样例:

AC代码及解析

基本思路:受到第一题启发 我们可以将这个二维矩阵转化成一维数组的形式

对于这三种操作:

  • 1.重塑
  • 我们对应一维数组中的元素是不变的 只需要将改变之后的矩阵规格更新一下 也就是n=a m=b
  • 2.转置
  • 也就是行列互换 具体来说就是 原来重塑的时候 我们是如何找到矩阵上的元素对应数组的下标
    比如说(1,2)
    我们就用【(当前行 1 乘以矩阵的列数 m )+ 2 】得到对应数组S的下标
    而现在转置之后 行和列的地位互换
    是不是就是 【(用当前列 2 乘以矩阵的行数 n)+1 】这样一个一个计算 得到对应 转置之后新的数组SS 之后再交换我们行和列的数值 这样就完成了一次转置操作
  • 3.查询对应位置上的元素
    直接输出对应数组元素就好
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,m,t;
int op,a,b;//这是操作格式
int s[N];//将重塑前的M转化为一维数组
int tmp[N];
int main()
{
   cin>>n>>m>>t;
   //构造一维数组
   for(int i=0;i<n*m;i++)
   {
           cin>>s[i];
   }
   //处理每一个查询
   while(t--)
   {
     cin>>op>>a>>b;
     if(op==1)//进行矩阵的重塑 不论怎么重塑都不会改变其对应一维数组的值的顺序
         //所以只需要更新一下矩阵大小的规模就行
     {
         n=a;
         m=b;
     }else if(op==2)//进行矩阵的转置(行列互换)
     {
          for(int i=0;i<n;i++)//i表示当前行数
          {
              for(int j=0;j<m;j++)//j表示当前列数
              {
                tmp[j*n+i]=s[i*m+j];//本质上就是行和列的地位互换了 i改成j n改成m
              }
          }
          //更新对应一维数组的值
          for(int i=0;i<n*m;i++)
          {
              s[i]=tmp[i];
          }
          //更新矩阵规模(本质上就是交换行和列的数值)
          int tt=n;
          n=m;
          m=tt;
     }else if(op==3)//进行查询操作(只有查询操作才需要输出)
     {
         cout<<s[a*m+b]<<endl;
     }
   }
    return 0;
}

货物调度

输入输出及样例:

AC代码及解析

写了一个世纪 结果只能暴力拿30分 道心破碎 虽然感觉这道题满分解是dp 但是真正写起来真的真的好困难 连最基本的选择和状态都很难确定下来 更别说状态转移方程了 哈哈

这里附上大佬解析:文章链接

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long

int dp[1005][40010];//前i个仓库费用j可以获得的最大总价值
vector<int>a[1005];//第i个仓库的第j个货物的价值
int b[1005],c[1005];//仓库属性
bool dcmp(int a,int b){
    return a>b;
}
int main(){
    int n,m,v;
    cin>>n>>m>>v;
    for(int i=0;i<=40000;i++)dp[0][i]=0;
    for(int i=1;i<=n;i++){
        cin>>b[i]>>c[i];
    }
    for(int i=1;i<=m;i++){
        int val,t;
        cin>>val>>t;
        t++;
        a[t].push_back(val);
    }
    for(int i=1;i<=n;i++){
        sort(a[i].begin(),a[i].end(),dcmp);
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<=40000;j++){
            dp[i][j]=dp[i-1][j];//不选i
            int sum=0;
            for(int k=0;k<a[i].size();k++){//选i
                if(b[i]+c[i]*(k+1)>j)break;
                sum+=a[i][k];//收益和
                dp[i][j]=max(dp[i][j],dp[i-1][j-b[i]-c[i]*(k+1)]+sum-b[i]-c[i]*(k+1));
            }
        }
    }
    int ans;
    for(int i=0;i<=40000;i++){
        if(dp[n][i]>=v){
            ans=i;break;
        }
    }
    cout<<ans;
    return 0;
}
相关推荐
不绝1918 分钟前
ARPG开发流程第一章——方法合集
算法·游戏·unity·游戏引擎
Arwen3031 小时前
解密国密 SSL 证书:SM2、SM3、SM4 算法的协同安全效应
算法·安全·ssl
天安彩1 小时前
mac下 vscode 运行 c++无法弹出窗口
c++·vscode·macos·clang
程序员编程指南1 小时前
Qt 网络编程进阶:WebSocket 通信
c语言·网络·c++·qt·websocket
地平线开发者1 小时前
征程 6|工具链部署实用技巧 6:hbm 解析 API 集锦
算法·自动驾驶
nlp研究牲1 小时前
latex中既控制列内容位置又控制列宽,使用>{\centering\arraybackslash}p{0.85cm}
服务器·前端·人工智能·算法·latex
前端拿破轮1 小时前
HomeBrew创始人都写不出来的翻转二叉树到底怎么做?
前端·算法·typescript
恣艺1 小时前
LeetCode 127:单词接龙
算法·leetcode·职场和发展
地平线开发者2 小时前
开发者说|RoboTransfer:几何一致视频世界模型,突破机器人操作泛化边界
算法·自动驾驶
hhhh明2 小时前
【调试Bug】网络在训练中输出NaN
人工智能·算法