Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมนับจำนวนที่ควรต่อท้ายเพื่อสร้างตัวเลขทั้งหมดตั้งแต่ 1 ถึง k ใน C++


สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums และอีกค่าหนึ่งคือ k เราต้องหาจำนวนตัวเลขขั้นต่ำที่เราต้องใส่ลงใน num เพื่อให้เราสามารถสร้างตัวเลขใดๆ จาก [1, k] โดยใช้เซตย่อยเป็น nums

ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[3, 5], k =6 ผลลัพธ์จะเป็น 2 เนื่องจากเราต้องแทรก 1, 2 เราจึงได้ :1 =[1], 2 =[2 ], 3 =[3], 4 =[1, 3], 5 =[5], 6 =[1, 5].

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • เรียงลำดับจำนวนอาร์เรย์
  • sum :=0, next :=1, ret :=0
  • สำหรับทั้งหมด i ใน nums
    • ต่อไป
    • ถ้าผลรวม>=k แล้ว:
      • ออกมาจากวงจร
    • sum :=sum + ถัดไป
    • ถัดไป :=ผลรวม + 1
    • (เพิ่มการถอนคืนโดย 1)
  • ถ้าผลรวม>=k แล้ว:
    • ออกมาจากวงจร
  • sum :=sum + i
  • ถัดไป :=ผลรวม + 1
  • ต่อไป <=k ทำ:
    • sum :=sum + ถัดไป
    • ถัดไป :=ผลรวม + 1
    • (เพิ่มการถอนคืนโดย 1)
  • คืนสินค้า
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #include
    using namespace std;
    class Solution {
       public:
       int solve(vector& nums, int k) {
          sort(nums.begin(), nums.end());
          int sum = 0;
          int next = 1;
          int ret = 0;
          for (int i : nums) {
             while (next < i) {
                if (sum >= k) break;
                sum += next;
                next = sum + 1;
                ret++;
             }
             if (sum >= k) break;
             sum += i;
             next = sum + 1;
          }
          while (next <= k) {
             sum += next;
             next = sum + 1;
             ret++;
          }
          return ret;
       }
    };
    
    int solve(vector& nums, int k) {
       return (new Solution())->solve(nums, k);
    }
    
    int main(){
       vector v = {3, 5};
       int k = 6;
       cout << solve(v, k);
    }

    อินพุต

    [3, 5], 6

    ผลลัพธ์

    2