第34次CCF-CSP認證
- 矩陣重塑(其一)
- AC代碼及解析
- 矩陣重塑(其二)
- AC代碼及解析
- 貨物調度
- AC代碼及解析
矩陣重塑(其一)
輸入輸出及樣例:
AC代碼及解析
-
1.線性化原矩陣 :由于cin的特性我們直接把給定的矩陣按照題目的意思轉換成一維數組即可
-
2.填充新矩陣 :然后對于新的矩陣 我們只需要按照新的規模p*q重新排版即可
#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.查詢對應位置上的元素
直接輸出對應數組元素就好
#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 但是真正寫起來真的真的好困難 連最基本的選擇和狀態都很難確定下來 更別說狀態轉移方程了 哈哈
這里附上大佬解析:文章鏈接
#include<bits/stdc++.h>
using namespace std;
#define ll long longint 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];//不選iint sum=0;for(int k=0;k<a[i].size();k++){//選iif(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;
}