CF954tj_2

· · 题解

题目传送

这道题细节比较多,调的我心态都快炸了

题目大意:

你需要求出一个形如下图的矩阵:

1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16

给你一条路线,判断有没有一种矩阵满足,若有输出一种长与宽,否则输出没有。

题目分析:

首先可以简单的推出,这个矩阵的长与合不合法没有关系,因此长直接输出 1000000000 即可。

求出宽是本题重点,设宽为 c,我们可以从以下几个方面判断路线是否合法。

注意还要判断 $c$ **不为 $0$**,要不然后面判断第三项时会报 ```Float Point Exception```。 **代码:** ```cpp #include<bits/stdc++.h> using namespace std; const int N=2e5+10; int n,c=1,a[N],t=1; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); if(i>1 && a[i]==a[i-1]) t=0;//第二项 if(i>1 && abs(a[i]-a[i-1])!=1 && a[i]!=a[i-1]) c=abs(a[i]-a[i-1]);//c设初始值 } for(int i=2;i<=n;++i){ if(abs(a[i]-a[i-1])!=1 && abs(a[i]-a[i-1])!=c) t=0;//第一项 else if(abs(a[i]-a[i-1])==1 && c!=1 && (a[i]-1)/c!=(a[i-1]-1)/c) t=0;//第三项 } if(!t) printf("NO"); else printf("YES\n1000000000 %d",&c);//注意长不能超过1e9 return 0; } ```