codeforces 954C. Matrix Walk(思维模拟)
http://codeforces.com/contest/954/problem/C
题意:
现在有一个大小为xy的矩阵(x,y大小未知),然后规定A(i,j)的值为y(i-1)+j,并且每次移动只能往四个方向移动。现在输入一个数n,然后输入n个数代表走过的轨迹a1,a2,…,an,问你能不能求出x,y如果能输出YES,并输出x和y,否则输出NO。
题解:
这题不难看出移动的跨度的值的绝对值不是1,就是y,一旦跨度比1大肯定就是y,然后我们就确定了y。但是我们确定了y不代表这个y就是对的(这里我wa了几次),因为有可能有其他跨度,或者走1的时候对于这个y来说是打斜走的。因此,得出y之后要进行第二次检查,跨度为1的两个点只能在同一行,我们可以用(a[i]+y-1)/y来确定在第几行,同理跨度为y只能在同一列,用a[i]%temp来确定第几列,这样就基本确定能不能找出来了。还有x是不用求的直接1e9就肯定满足了。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int temp=1;
int flag=0;
for(int i=1;i<n;i++)
{
if(abs(a[i]-a[i-1])>1)
{
temp=abs(a[i]-a[i-1]);
break;
}
}
for(int i=1;i<n;i++)
{
if(abs(a[i]-a[i-1])==temp)
{
if((a[i]%temp)!=(a[i-1]%temp))
{
flag=1;
break;
}
}
else if(abs(a[i]-a[i-1])==1)
{
if((a[i]+temp-1)/temp!=(a[i-1]+temp-1)/temp)
{
flag=1;
break;
}
}
else
{
flag=1;
break;
}
}
if(flag)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
cout<<1000000000<<" "<<temp<<endl;
}
}
Q.E.D.