zoukankan      html  css  js  c++  java
  • codeforces 424D

    题意:给定n,m<=300的矩阵,然后求一个长宽大于2的矩形,使得是从左上角位置开始逆时针绕边框一圈的时间最少。时间的计算是:给定3个数tu,tp, td,路径上数字增加为tu,相等为tp否则为td。

    思路:直接预处理出4个数组,然后直接暴力。n4的方法。但是常数小可以4000+ms过。

            还有一种n3logn的方法。。

            具体是固定右下角,然后枚举右上角,然后通过一个通过地推维护一个前缀,二分查找。。

             不过常数肯定比暴力大估计快不了多少。。

    code:

     1 #include <bits/stdc++.h>
     2 #define M0(x) memset(x, 0, sizeof(x))
     3 #define repf(i, a, b) for(int i = (a); i <= (b); ++i)
     4 #define repd(i, a, b) for(int i = (a); i >= (b); --i)
     5 using namespace std;
     6 int U[303][303], D[303][303], L[303][303], R[303][303], a[303][303];
     7 int n, m;
     8 int tp, tu, td, t;
     9 
    10 inline int f(const int& a, const int& b){
    11      return a == b ? tp : (a > b ? tu : td); 
    12 }
    13 
    14 void init(){
    15      scanf("%d%d%d", &tp, &tu, &td);
    16      M0(U), M0(D), M0(L), M0(R), M0(a);
    17      repf(i, 1, n) repf(j, 1, m) scanf("%d", &a[i][j]);
    18      repf(i, 1, n) repf(j, 1, m){
    19           D[i][j] = D[i-1][j] + f(a[i][j], a[i-1][j]);
    20           R[i][j] = R[i][j-1] + f(a[i][j], a[i][j-1]);
    21      }
    22      repd(i, n, 1) repd(j, m, 1){
    23           U[i][j] = U[i+1][j] + f(a[i][j], a[i+1][j]);
    24           L[i][j] = L[i][j+1] + f(a[i][j], a[i][j+1]);
    25      }
    26 }
    27 
    28 void solve(){
    29      int ansd = 0x3fffffff, ans = 0;
    30      int lx, ly, rx, ry, d;
    31      int tmp;
    32      for (int x = 1; x <= n; ++x)
    33          for (int y = 1; y <= m; ++y)
    34              for (int x1 = x + 2; x1 <= n; ++x1)
    35                  for (int y1 = y + 2; y1 <= m; ++y1){
    36                       tmp = D[x1][y1] - D[x][y1] + U[x][y] - U[x1][y];
    37                       tmp += (R[x][y1] - R[x][y] + L[x1][y] - L[x1][y1]);
    38                       d = abs(tmp - t);
    39                       if (d < ansd || (d == ansd && tmp < ans)){
    40                            lx = x, ly = y;
    41                            rx = x1, ry = y1;
    42                            ansd = d, ans = tmp;
    43                       }           
    44                  }
    45 //    cout <<ans << endl; 
    46      printf("%d %d %d %d
    ", lx, ly, rx, ry);
    47 }
    48 
    49 int main(){
    50 //    freopen("a.in", "r", stdin);
    51     while (scanf("%d%d%d", &n, &m, &t) != EOF){
    52           init();
    53           solve();
    54     }
    55     return 0;
    56 }
    View Code
  • 相关阅读:
    为什么puppeteer比selenium好?
    Puppeteer
    js跳出多层循环
    webpack loader- 图片处理
    webpack的loader的原理和实现
    Webpack中Loader的pitch方法
    url-loader和file-loader区别
    Vue中强制组件重新渲染的正确方法
    ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION :浏览器下载报错
    JSBridge的原理及使用
  • 原文地址:https://www.cnblogs.com/yzcstc/p/4067588.html
Copyright © 2011-2022 走看看