2023年CCF-CSP考前冲刺

202305-1重复局面

思路
题目的意思是我们输入n组局面,每个局面由64个字符组成,然后判断有没有相同局面。那么我们就可以开一个map,用字符数组a记录每个局面的字符,然后放入map中,每次输出它的次数即可。
代码

#include<bits/stdc++.h>
using namespace std;
int n;
char a[64];
map<string,int> mp;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<64;j++) cin>>a[j];
		if(mp.count(a)) mp[a]++;
		else mp[a]=1;
		cout<<mp[a]<<endl; 
	}
	return 0;
}

202305-2矩阵运算

思路
根据题目描述,本题就是简单的矩阵运算,关键在于先算哪个。在纸上列一下矩阵运算的过程,用for循环即可求解。
代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10010,D=30;
ll tmp[D][D],ans[N][N];
int n,d;
int Q[N][D],K[N][D],V[N][D],W[N];
int main(){
	cin>>n>>d;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=d;j++){
			cin>>Q[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=d;j++){
			cin>>K[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=d;j++){
			cin>>V[i][j];
		}
	}
	for(int i=1;i<=n;i++) cin>>W[i];
	
	//计算K的转置*V=tmp
	for(int i=1;i<=d;i++){
		for(int j=1;j<=d;j++){
			for(int k=1;k<=n;k++){
				tmp[i][j]+=K[k][i]*V[k][j];
			}
		}
	}
	
	//计算Q*tmp=ans
	for(int i=1;i<=n;i++){
		for(int j=1;j<=d;j++){
			for(int k=1;k<=d;k++){
				ans[i][j]+=Q[i][k]*tmp[k][j];
			}
			ans[i][j]*=(ll)W[i];
		}
	} 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=d;j++){
			cout<<ans[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

202303-1 田地丈量

思路
这个题在于画图明确面积的计算公式。
画图可知,每块面积的计算公式为x*y
x是右边界减去左边界
右边界取相应的最小值,左边界取相应的最大值
上下边界同理
代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a,b;
	int x1,y1,x2,y2;
	int x,y;
	int sum=0;
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++){
		cin>>x1>>y1>>x2>>y2;
		x=min(a,x2)-max(0,x1);
		y=min(b,y2)-max(0,y1);
		if(x>=0&&y>=0){
			sum+=x*y;
		}
	}
	cout<<sum;
	return 0;
}

202303-2垦田计划

思路
我们用flag标记用时i天的区域缩短一天所用的时间
然后从max(所用的最长时间)开始判断max和k的大小,如果相等了,就直接退出循环
否则判断手中资源m和所用最大时间对应缩短一天需要的资源数flag[i]进行比较,如果大于的话,资源m就减去flag[i],然后把这些资源数放到flag[i-1]上,max–。直到资源不够为止。
然后输出max。
感觉这道题主要是一个分类的思想。重点在于把每个相同时间的缩短一天所用资源数放在一起。
代码

#include<bits/stdc++.h>
using namespace std;
int n,k;
long long m;
map<int,int> tim,res,flag;
int main(){
	cin>>n>>m>>k;
	int max=0;
	for(int i=0;i<n;i++){
		cin>>tim[i]>>res[i];
		max=max>tim[i]?max:tim[i];
		flag[tim[i]]+=res[i];//flag[i]为用时i天的区域缩短一天所用时 
	}
	for(int i=max;i>0;i--){
		if(max==k) break;
		if(m>flag[i]){
			m=m-flag[i];
			flag[i-1]+=flag[i];
			max--;
		}else break;
	} 
	cout<<max;
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值