zoukankan      html  css  js  c++  java
  • 蓝桥杯-PREV45-图形排版

    这是2017年蓝桥杯C组C++的压轴题,拿到之后没什么想法。但是蓝桥杯有部分分。所以直接敲了个大暴力提交上去过了一半的数据。后来想到了DP,但是没能实现出来,感觉还是有问题的。后来看了解题视频发现是预处理。

    • 大暴力
      图形排版 739B C++ 运行超时 50 运行超时 1.585MB
      #include "cstdio"
      #include "algorithm"
      using namespace std;
      typedef pair<int, int> PII;
      const int MAXN = 100005;
      const int INF = 0x3f3f3f3f;
      PII arr[MAXN];
      int n, m;
      int check(int id) {
          int k = n, cnt = 0, h = 0;
          for (int i = 0; i < m; i++) {
              if (i == id) {
                  continue;
              }
              if (k > arr[i].first) {
                  k -= arr[i].first;
                  h = max(h, arr[i].second);
              } else {
                  h = max(h, (arr[i].second * k - 1) / arr[i].first + 1);
                  k = n;
                  cnt += h;
                  h = 0;
              }
          }
          if (h != 0) {
              cnt += h;
          }
          return cnt;
      }
      int main() {
          scanf("%d%d", &n, &m);
          for (int i = 0; i < m; i++) {
              scanf("%d%d", &arr[i].first, &arr[i].second);
          }
          int mn = INF;
          for (int i = 0; i < m; i++) {
              mn = min(mn, check(i));
          }
          printf("%d
      ", mn);
          return 0;
      }

      比赛想不到后面的方法感觉这个方法也够了,毕竟我做到最后一题的时候时间已经不多了。

    • 预处理
      图形排版 1.300KB C++ 正确 100 62ms 2.070MB
      #include "cstdio"
      #include "iostream"
      #include "algorithm"
      using namespace std;
      typedef pair<int, int> PII;
      const int MAXN = 100005;
      const int INF = 0x3f3f3f3f;
      // 存n张图片,first为宽,second为高 
      PII arr[MAXN];
      // 预处理,f[i]表示第i张图到第n张图需要的高度 
      int f[MAXN];
      int n, m;
      // Add用于往一个行里加入第k张图片 
      void Add(PII* p, int k) {
          if (p->first + arr[k].first < m) {
              p->first += arr[k].first;
              p->second = max(p->second, arr[k].second);
          } else {
              p->second = max(p->second, (arr[k].second * (m - p->first) - 1) / arr[k].first + 1);
              p->first = m;
          }
      }
      int getF(PII p, int k) {
          while (k <= n && p.first < m) {
              Add(&p, k);
              k++;
          }
          // 因为已经求出f[k]了,所以k后面就不用再算了; 
          return p.second + f[k];
      }
      int main() {
          scanf("%d%d", &m, &n);
          for (int i = 1; i <= n; i++) {
              scanf("%d%d", &arr[i].first, &arr[i].second);
          }
          for (int i = n; i >= 1; i--) {
              f[i] = getF(make_pair(0, 0), i);
          }
          // pre表示在now表示的行上面已经存在的高度; 
          int pre = 0, res = INF;
          // now表示当前正在填充的行 
          PII now = make_pair(0, 0);
          for (int i = 1; i <= n; i++) {
              res = min(res, pre + getF(now, i + 1));
              Add(&now, i);
              if (now.first == m) {
                  pre += now.second;
                  now.first = now.second = 0;
              }
          }
          printf("%d
      ", res);
          return 0;
      }
  • 相关阅读:
    vuex
    koa2+node+vue自启服务运行本地脚本
    重新认识js(一)
    JQuery图片左右无缝滚动
    javascript兼容性很好的省市区联动,易修改
    JQuery超级简单的TAB选项卡
    ViewState的原理分析
    JQuery图片切换特效
    asp.net验证控件详解【转】
    时间线 制作
  • 原文地址:https://www.cnblogs.com/Angel-Demon/p/10575360.html
Copyright © 2011-2022 走看看