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=tmpfor(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=ansfor(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;
}