2022-09-25 散发着糟糕气味のhorrible模拟赛之summary

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 nm 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值