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

  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4584615.html
Copyright © 2011-2022 走看看