2022/09/25——模拟赛总结
有的人活着,他已经死了;有的人死了,他还活着。——鲁迅
非要说引用这句名言有什么用意,哦,没有。
记一次失败的模拟赛。
如图所示,全挂了
ﻬ苚笑殗飾殇ོ࿆༅ ﻬ苚笑殗飾殇ོ࿆༅ ﻬ苚笑殗飾殇ོ࿆༅
时间安排
8 : 00 8:00 8:00 ~ 8 : 10 : 8:10: 8:10:看题,看了一遍题,然后又看了一遍题,没了。
8 : 10 8:10 8:10 ~ 8 : 50 : 8:50: 8:50:想 T 1 T1 T1,想了很久,没想出来。。
8 : 50 8:50 8:50 ~ 9 : 20 : 9:20: 9:20:想不出来 T 1 T1 T1,所以去写 T 3 T3 T3的暴力了。(然后最后全 R E RE RE了)
9 : 20 9:20 9:20 ~ 10 : 00 : 10:00: 10:00:想了会儿 T 2 T2 T2,然后,,不会。
10 : 00 10:00 10:00 ~ 10 : 50 : 10:50: 10:50:写 T 4 T4 T4,很眼熟(是原题,但是原题没写),看错题以为容斥,然后寄了。
10 : 50 10:50 10:50 ~ 11 : 40 : 11:40: 11:40:去写 T 1 T1 T1了,硬写,所以也没了。
这个题吧,
害。
T 1 T1 T1 虽然叫扫雷但是并不是扫雷的假扫雷,看正解,看不懂,我不理解。
[题目描述] 现在 Cuber QQ 在玩扫雷游戏,游戏是一个 的矩阵,每一个位置是 或者 ,表示有没有地 雷。 现在对于每一个格子,CuberQQ 都知道当前格子以及其相邻的八个格子中(如果处于边界上,则会少 于八个格子)的地雷数量,他现在想知道地雷的总数。
比如,假设地雷的布局是这样的:
011
010
000
则 Cuber QQ 所知道的矩阵是这样的:
233
233
111
[输入格式] 输入第一行包含两个整数 。 接下来的 行,每行包含个整数,表示矩阵中每一个位置以及其相邻的八个格子中的地雷数量。
[输出格式] 输出包含一个整数,表示地雷的总数。
看这个题,我没有想说的了。这题**都会写啊()
把整个分成3*3的小块,每一块的雷数就是中间的数字。(至于多出来的部分,哦,难道你还要我告诉你吗)
以下是我考后速打的代码:(其实没必要,但是题目都贴了不写代码怪怪的)
#include<bits/stdc++.h>
using namespace std;
int m,n,ans,a[210][210];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
if(n%3==0||n%3==2){
if(m%3==0||m%3==2){
for(int i=2;i<=n;i+=3)
for(int j=2;j<=m;j+=3)
ans+=a[i][j];
cout<<ans<<endl;
return 0;
}
if(m%3==1){
for(int i=2;i<=n;i+=3)
for(int j=1;j<=m;j+=3)
ans+=a[i][j];
cout<<ans<<endl;
return 0;
}
}
if(n%3==1){
if(m%3==0||m%3==2){
for(int i=1;i<=n;i+=3)
for(int j=2;j<=m;j+=3)
ans+=a[i][j];
cout<<ans<<endl;
return 0;
}
if(m%3==1){
for(int i=1;i<=n;i+=3)
for(int j=1;j<=m;j+=3)
ans+=a[i][j];
cout<<ans<<endl;
return 0;
}
}
return 0;
}
也许有更简单的写法,我说的是,代码长度。
T 2 T2 T2 我做梦都想不到的奇妙思路之数连通块个数。。。
[题目描述] 现在 Cuber QQ 有一个 n ∗ m n*m n∗m 的 01 01 01 矩阵,他想要将矩阵的所有位置都变成 1 1 1 。他可以进行如下的操作:
把其中一个位置从0 变成1,花费4 ;
如果位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 1 , y 2 ) (x_1,y_1),(x_2,y_2),(x_1,y_2) (x1,y1),(x2,y2),(x1,y2) 是1 ,把 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)从 0变成1 花费3 。
现在 Cuber QQ 想知道最小的花费是多少。
[输入格式] 第一行包含两个整数 n n n , m m m ( 1 < = n , m < = 1000 ) (1<=n,m<=1000) (1<=n,m<=1000)表示矩阵的大小。
接下来的 n n n 行表示 01 矩阵。
[输出格式] 输出一行一个整数,表示答案。
挺奇妙的,看了题解,只能说思维加深了又。 女少口阿 女少口阿 女少口阿
用并查集写的,将行和列分成两个集,如果 a [ i ] [ j ] = 1 a[i][j]=1 a[i][j]=1,那就联通 i i i和 j + 1 j+1 j+1(十分好想)
在理想的情况下,所有的0都可以以3的代价被变成1,可以先求出这个总代价,因为不理想的情况需要多加1,所以再加上现实中的必须联通的块的个数-1(有点抽象这样说)(建议自己手推画图)
代码如下(不想编了):
#include<bits/stdc++.h>
using namespace std;
int n,m,fa[2100],cnt,cntt,ans;
char x;
int get(int x){
if(x==fa[x]) return x;
else return fa[x]=get(fa[x]);
}
void mer(int x,int y){
fa[get(x)]=get(y);
}
int main(){
scanf("%d%d\n",&n,&m);
for(int i=1;i<=m+n;i++) fa[i]=i;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%c",&x);
if(x=='1') mer(i,j+n),cnt++;
}
scanf("\n");//scanf麻烦所在
}
//cnt:1的个数
for(int i=1;i<=m+n;i++)
if(fa[i]==i) cntt++;
//cntt:连通块个数
ans=(n*m-cnt)*3+cntt-1;
//0的个数*3:理想状态最小值,+现实需要多加的几个1
cout<<ans;
}
T 3 T3 T3 数学是吧,是数学?行。
T 4 T4 T4 原题,不想说话。(做俯卧撑 i n g ing ing)
R e a l Real Real S u m m a r y Summary Summary
嗯。
f i r s t first first 作业写不完的小孩不是好小孩。
s e c o n d second second 写了作业还不会的小孩是bad child。
t h i r d third third 学后面忘前面是坏文明。
f o r t h forth forth 考试还钻牛角尖是()。
f i f t h fifth fifth 考试看题走神是恶劣习惯。
l a s t last last b u t but but l e a s t least least 写句子不加标点语文考试不给分。
有问题,解决就好了。
我们既然有办法克服困难,我们的事业就是有希望的,我们的前途是光明的。 ——毛泽东
T H E THE THE _ E N D END END