zoukankan      html  css  js  c++  java
  • minimal sparse ruler problem 最少尺子刻度问题

    一个长度13的尺子,如果在1位置刻点可以量出1和12,13三种刻度.那么至少刻几个点,可以直接量出1-13所有的长度,分别刻在哪几个位置?

    注:必须是直接量。即在尺子上能找出一个1-13任意的整数长度。

    写了个没什么技术含量的dfs暴力求解。一个可行解是 1, 2, 6, 10。

     1 #include <iostream>
     2 #include <vector>
     3 #include <unordered_map>
     4 using namespace std;
     5 
     6 class Solution {
     7 public:
     8     vector<vector<int>> ruler(int n, vector<int> &minPath) {
     9         dfs(0, n, minPath);
    10         return result;
    11     }
    12     vector<vector<int>> result;
    13     vector<int> path;
    14     void dfs(int start, int n, vector<int> &minPath) {
    15         if (start == n + 1) {
    16             if (fullScale(path)) {
    17                 result.push_back(path);
    18                 if (path.size() < minLen) {
    19                     minLen = path.size();
    20                     minPath = path;
    21                 }
    22             }
    23             return;
    24         }
    25         for (int i = start; i <= n; i++) {
    26             path.push_back(i);
    27             dfs(i + 1, n, minPath);
    28             path.pop_back();
    29         }
    30     }
    31     bool fullScale(vector<int> path) {
    32         if (path.size() < 4) {
    33             return false;
    34         }
    35         unordered_map<int, int> umap;
    36         umap[13]++;
    37         umap[0]++;
    38         for (int i = 0; i < path.size(); i++) {
    39             for (int j = 0; j < i; j++) {
    40                 if (path[i] - path[j] < 13) {
    41                     umap[path[i] - path[j]]++;
    42                     umap[path[j]]++;
    43                     umap[path[i]]++;
    44                     umap[13 - path[i]]++;
    45                     umap[13 - path[j]]++;
    46                 }
    47                 if (umap.size() >= 14) {
    48                     return true;
    49                 }
    50             }
    51         }
    52         return false;
    53     }
    54 private:
    55     int minLen = 13;
    56 };
    57 
    58 int main() {
    59     int n = 13;
    60     Solution solu;
    61     vector<int> minPath;
    62     vector<vector<int>> res = solu.ruler(n, minPath);
    63     for (auto x : minPath) {
    64         cout << x << ", ";
    65     }
    66 }

    ref: https://en.wikipedia.org/wiki/Sparse_ruler

  • 相关阅读:
    #3232. 「POI2019 R1」Najmniejsza wspólna wielokrotność
    bzoj4129 Haruna's Breakfast
    uoj:【UNR #3】配对树
    #3409. 小P的生成树(mst)
    #1790. 小A的树
    #2689. 异或树(tree)
    #4740. 校运会
    #4738. 迷惑数字统计
    #4742. 寻找字符串
    dtoj1825. 放棋子(chess)
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4584615.html
Copyright © 2011-2022 走看看