CodeForces - 954C - Matrix Walk

25 篇文章 0 订阅

坑题
题目:CodeForces - 954C
题意:矩阵的每一元素可以用 Ai, j = y*(i - 1) + j 来表示,(就是二维数组用一维指针表示的方法),给你一个路径序列,问这样的序列能否在前述矩阵中实现。能输出YES和x,y值(x的值不是必须最优),否则输出NO。
坑点:不能站着不动,任意的a[i] != a[i-1];

思路:

  1. for循环找a数组中有没有相同的元素,有直接退出,顺便求出y值,当a中相邻元素绝对值不相差1时,y = abs(a[i] - a[i-1]);因为增减1则就一列(y = 1)没问题,如果是1,2,3,4,6 这种也没关系,之后再for循环检查一遍,看是不是所有a[i] 都在 a[i-1] 旁边就ok了。
  2. 做题WA了好多次,WA在第7组的提供个样例
    10
    1 2 3 4 5 6 7 8 9 11
    参考了一篇博客(博客链接),但是它的代码WA了,我给他改AC了,在此也提供他的思路,并给出AC代码。他的思路是两个点要么差1,要么差y,如果差1,但是不相邻,就特判一下。但是他没有考虑到for循环找y值时,y值会被多次修改,以及当只有一列(y == 1)时不需要做判断。

代码实现me:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 200010;
int n,a[MAXN];

int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
bool check(int a1,int a2,int y){
    LL a1x = a1/y + ((a1%y)?1:0);
    LL a1y = a1 - (a1x-1)*y;
    if(a1y > y || a1y < 1)//a[i]超范围 
        return false;
    LL a2x = a2/y + ((a2%y)?1:0);
    LL a2y = a2 - (a2x-1)*y;
    bool flag = 0;
    for(int i=0;i<4;i++){
        LL a2x_ = a2x+dir[i][0];
        LL a2y_ = a2y+dir[i][1];
        if(a2y_ > y || a2y_<1)
            continue;
        if(a2x_ == a1x && a2y_ == a1y){
            flag = 1;
            break;
        }
    }
    if(flag)
        return true;
    return false;
}

int main(int argc, char const *argv[])
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    LL y = 1;
    bool ans = 1;
    for(int i=1;i<n;i++){
        if(a[i] == a[i-1]){
            ans = 0;
            break;
        }
        if(y==1 && abs(a[i]-a[i-1])!=1){//不增减一,则可确定y
            y = abs(a[i] - a[i-1]);
        }
    }
    for(int i=1;i<n;i++){
        if(!check(a[i],a[i-1],y)){//a[i]不在a[i-1]旁边,输出错误信息
            ans = 0;
            break;
        }   
    }
    if(ans) 
        cout<<"YES"<<endl<<1000000000<<' '<<y<<endl;
    else 
        cout<<"NO"<<endl;
    return 0;
}

代码实现he:

#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int a[N];
int main(){
    ios_base::sync_with_stdio(0);
    int n;cin>>n;
    int y = 1;
    for (int i = 0; i < n; i++) {
        cin>>a[i];
        if(i == 0) continue;
        if(a[i] == a[i - 1]) {
            cout<<"NO"<<endl;return 0;
        }
        if(y==1 && abs(a[i] - a[i - 1] != 1)) {//修改为只有在y为1时修改
            y = abs(a[i] - a[i - 1]);
        }
    }
    for (int i = 1; i < n; i++) {
        if(y == 1) continue;//y==1时不做判断
        if((abs(a[i] - a[i - 1]) != 1 && abs(a[i] - a[i - 1]) != y)){
            cout<<"NO"<<endl;return 0;
        }
        if(a[i] % y == 0 && a[i - 1] - a[i] == 1) {
            cout<<"NO"<<endl;return 0;
        } else if(a[i] % y == 1 && a[i] - a[i - 1] == 1) {
            cout<<"NO"<<endl;return 0;
        }
    }
    cout<<"YES"<<endl<<1000000000<<' '<<y<<endl;
    return 0;
}

小结:这道题Debug的时间比我想象的要长的多,做了一晚上,醉了,太菜,看不懂英文,理解错题意,无话可说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值