3 条题解

  • 0
    @ 2024-4-12 11:25:55

    大暴力模拟法

    把这个三角形旋转45度,可以得到以下类似的三角

      1
     3 2
    4 5 6
    .....
    

    接下来暴力枚举出这个三角形

    vector<vector<i64>> vecs, ans;
    for (int i = 1, j = 1, k = 1; i <= 40; ++i, ++j) {
        vector<i64> arr;
        for (int x = 0; x < j; ++x) {
            arr.emplace_back(k++);
        }
        if (~i & 1)
            reverse(arr.begin(), arr.end());
        vecs.emplace_back(arr);
    }
    

    然后将斜线的元素转为直线储存的

    for (int x = 0; x < 40; ++x) {
        vector<i64> arr;
        for (int i = 0; i < 40; ++i) {
            if (vecs[i].empty())
                continue;
            arr.emplace_back(vecs[i].back());
            vecs[i].pop_back();
        }
        ans.emplace_back(arr);
    }
    

    接下来直接查表即可

    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    using i64 = long long;
    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        vector<vector<i64>> vecs, ans;
        for (int i = 1, j = 1, k = 1; i <= 40; ++i, ++j) {
            vector<i64> arr;
            for (int x = 0; x < j; ++x) {
                arr.emplace_back(k++);
            }
            if (~i & 1)
                reverse(arr.begin(), arr.end());
            vecs.emplace_back(arr);
        }
        for (int x = 0; x < 40; ++x) {
            vector<i64> arr;
            for (int i = 0; i < 40; ++i) {
                if (vecs[i].empty())
                    continue;
                arr.emplace_back(vecs[i].back());
                vecs[i].pop_back();
            }
            ans.emplace_back(arr);
        }
        cout << ans[19][19];
        return 0;
    }
    
    • 0
      @ 2024-4-11 11:45:42

      直接观察法找规律1 5 13 25 应该是对角元素依次差一个对应次数的乘4; eg: 开始元素1 第二个:1+14=5 第三个:5+24=13 然后

      #include<bits/stdc++.h>
      using namespace std;
      int main()
      {
      	int i=1,n=4;
      	for(int j=1;j<=20;j++)
      	{
      		i+=(j*n);
      		cout<<"第"<<j+1<<"个"<<i<<endl;
      		
      	}
          return 0;
      }
      

      即可

      • 0
        @ 2024-4-9 1:20:37

        【2020年省赛B组】试题C: 蛇形填数

        题解

        规律题。

        定义,表示当前位置所在行,c表示当前位置所在列,ans 记录当前位置的数值。 那么下一个位置将会有以下六种情况:

        • r=1r = 1,c为奇数:那么下一步将会到达的位置为(r,c+1r, c +1)。
        • r=1r = 1,c为偶数:那么下一步将会到达的位置为(r+1,c1r+1, c - 1)。
        • c=1c= 1,r为偶数,那么下一步将会到达的位置为(r+1,cr+1, c)。
        • c=1c= 1,r为奇数且r1r \neq 1,那么下一步将会到达的位置为(r1,c+1r - 1, c + 1)。
        • r1r \neq 1,c1c \neq 1,r+cr + c为奇数,那么下一步将会到达的位置为(r+1,c1r + 1, c - 1)。
        • r1r \neq 1,c1c \neq 1,r+cr +c为偶数,那么下一步将会到达的位置为(r1,c+1r - 1, c +1)。 按照这 6 种情况模拟,每走一步 ans 就加 1,直到 r = 20,c= 20 时结束模拟输出 ans。 最后的答案为 761

        提交代码

        #include<bits/stdc++.h>
        using namespace std;
        signed main()
        {
            int r = 1 , c = 1 , ans = 1;
            while(r != 20 || c != 20){
                if(r == 1){
                    if(c & 1) c ++ ;
                    else r ++ , c --;
                }
                else if(c == 1){
                    if(r % 2 == 0) r ++;
                    else r -- , c ++;
                }
                else if((r + c) % 2) r ++ , c -- ;
                else r -- , c ++ ;
                ans ++ ;
            }
            cout << ans << '\n';
            return 0;
        }
        
        • 1

        信息

        ID
        998
        时间
        1000ms
        内存
        256MiB
        难度
        3
        标签
        递交数
        83
        已通过
        39
        上传者