CF954tj_2
SamHJD
·
·
题解
题目传送
这道题细节比较多,调的我心态都快炸了。
题目大意:
你需要求出一个形如下图的矩阵:
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;
}
```