首页 > 其他分享 >CF1450C2 题解

CF1450C2 题解

时间:2023-07-12 17:22:55浏览次数:62  
标签:格子 puts int 题解 CF1450C2 define

题目传送门

再不写题解社贡要掉到 \(0\) 了。

题目分析

显然如果 \(3\) 个格子构成了满足获胜条件的情况,这 \(3\) 个格子模 \(3\) 的余数各不相同。

那么我们将格子按模 \(3\) 的余数分为 \(3\) 类,只要保证相邻 \(3\) 个格子中有 \(2\) 个不同就行了,不需要动第 \(3\) 个。

我们令格子数最多的类型为 . 而其余为 XO,显然 . 的个数不少于总数的 \(\dfrac{1}{3}\)。

剩下有 \(2\) 种情况,分别是第 \(1\) 类 X、第 \(2\) 类 O 和第 \(1\) 类 O、第 \(2\) 类 X,它们操作次数的总和一定是 XO 的数量之和。根据抽屉原理,一定有一种情况操作不超过 \(\lfloor \dfrac{k}{3} \rfloor\)

贴上代码

// Problem: Errich-Tac-Toe (Hard Version)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1450C2
// Memory Limit: 250 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
// #define int long long
#define ok puts("First")
#define no puts("Second")
#define debug puts("Shima_Rin_kawaii")
#define clean fflush(stdout)
using namespace std;
int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();	
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-48;
		c=getchar();
	}
	return x*f;
}
const int maxn=310;
int n;
int res;
int a[5];
char s[maxn][maxn],ans[maxn][maxn];
inline void init(){
	n=read();res=0;
	memset(a,0,sizeof(a));
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j) cin>>s[i][j];
	}
}
inline void solve(){
	init();
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j){
			if(s[i][j]=='X') a[(i+j)%3]++;
			else if(s[i][j]=='O') a[(i+j-1)%3]++;
		}
	}
	for(register int i=0;i<3;++i){
		if(a[i]<=a[res]) res=i;
	}
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j){
			if(s[i][j]=='X'&&(i+j)%3==res) ans[i][j]='O';
			else if(s[i][j]=='O'&&(i+j-1)%3==res) ans[i][j]='X';
			else ans[i][j]=s[i][j];
		}
	}
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j) cout<<ans[i][j];
		puts("");
	}
}
int main(){
//	freopen("test.out","w",stdout);
	int T=read();
	while(T--) solve();
}

标签:格子,puts,int,题解,CF1450C2,define
From: https://www.cnblogs.com/yizhixiaoyun/p/17548276.html

相关文章

  • Facetook Priority Wall 题解
    题目传送门一道模拟题。用一个map存储每个人的优先级因子,然后存进vector里进行排序。难点在于分辨\(X\)和\(Y\)与当前是什么操作。不过需要注意,只要出现了名字就需要输出,且我们认为与你没关系的人不加分。Code#include<bits/stdc++.h>#definelllonglong#define......
  • centos7ping不通主机却能够上网时的问题解决方案
       ......
  • Codeforeces #1844 A~D题解
    Codeforeces#1844A~D题解ASubtractionGame博弈论A+Bproblem由于只有两种数字可选,若石子数量为a+b,先手选完之后必然为a或b,因此后手可以直接选完BPermutations&Primes构造构造方法:35791108642,这样把1放中间可以让最多的区间拿到1,接下来避免同时拿......
  • 「Network」题解
    「CEOI2012」NetworkSolutiontoQuestionⅠ首先缩点(当然也可以不缩?),然后跑一遍DFS即可。//w为联通分量里的节点个数inlinevoiddfs(constint&u){ ans1[u]=w[u]; for(intv:G_scc[u]) dfs(v),ans1[u]+=ans1[v];}SolutiontoQuestionⅡ观察缩完点后......
  • 正方形鱼池题解
    首先这道题\(T\)的范围很小,而\(N\)的范围却很大,所以我们只能枚举树那么我们如何枚举呢,树有上下左右之分,看起来十分难枚举,现在让我们仔细分析一下:水池的边长就等于\(min(上下界的距离,左右界的距离)\)这时我们就可以开始枚举了,我枚举的是左右界那么我们此时就可以发现上下界的两......
  • 题解 [NOIP2011 提高组] 聪明的质监员
    题目链接不难发现,\(W\)越大,\(y_i\)以及\(y\)就越小,\(W\)越小,\(y_i,y\)就越大。所以这是一个二分答案。考虑如何\(check\)。观察\[y_i=\sum\limits_{j=l_i}^{r_i}[w_j\geW]\times\sum\limits_{j=l_i}^{r_i}[w_j\geW]v_j\]不难发现,乘号的前后都是区间和的形式,有......
  • 【开机10】解决出现问题,你的PIN不可用,单击以重新设置PIN 无法打开相机 设置我的PIN 登
    \(弄了1.5个小时,找到这个视频,终于弄好了!!!!!!\)\(如果各位基友出现这种问题,可以参考。\)【开机10】解决出现问题,你的PIN不可用,单击以重新设置PIN无法打开相机设置我的PIN登录选项诊断启动禁用服务后问题解决......
  • 洛谷 P4869 albus就是要第一个出场 题解
    洛谷P4869albus就是要第一个出场题意给定一个长度为\(n\)的序列\(A\),设可重集合\(S=\left\{\operatorname{xor}_{i=1}^nA_ix_i\midx_i\in\{0,1\}\right\}\),即\(S\)为\(A\)的所有子集的异或和构成的集合。给定一个数\(k\),求\(k\)在\(S\)中的排名。如果\(S\)中......
  • AT_abc306_h 题解
    AT_abc306_hBalanceScale题解Links洛谷AtCoderDescription有\(N\)个编号为\(1,2,\dots,N\)的砝码。有\(M\)次比较操作,每次比较砝码\(A_{i}\)和\(B_{i}\),\(A_{i}\)在左侧。分为三种情况:左边的砝码更重。右边的砝码更重。两边的砝码重量相同。将每次比较的......
  • CF878E 题解
    CF878ENumbersontheblackboard题解Links洛谷CodeforcesDescription给出\(n\)个数字,每次询问一个区间\([l,r]\),对这个区间内部的点进行如下操作。每次操作可以合并相邻两个数\(x,y\),用\(x+2y\)替换它们。对于每次询问,输出当最后只剩下一个数字时,这个数字的最大......