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

X ของชนิดเดียวในสำรับไพ่ใน C++

ปัญหา

สมมติว่าเรามีสำรับไพ่ แต่ละใบมีจำนวนเต็มเขียนอยู่ เราต้องตรวจสอบว่าสามารถเลือก X >= 2 ได้หรือไม่ โดยที่สามารถแบ่งสำรับทั้งหมดเป็น 1 หรือหลายกลุ่มของไพ่ได้ โดยเงื่อนไขต่อไปนี้: แต่ละกลุ่มมีจำนวนไพ่เท่ากับ X ใบพอดี ไพ่ทั้งหมดในแต่ละกลุ่มมีตัวเลขเดียวกัน

เช่น ถ้าผนวกเข้าเป็น deck = [1,2,3,4,4,3,2,1] ผลลัพธ์จะเป็น True เนื่องจากแบ่งได้เป็น [1,1],[2,2],[3,3],[4,4]

วิธีแก้ปัญหา

  1. กำหนด map mp หนึ่งอัน
  2. for ทุก x ใน deck: เพิ่ม mp[x] ขึ้น 1
  3. for ทุกคู่ key-value x ใน mp: ans := gcd ของ (ans และ value ของ x)
  4. คืนค่า true เมื่อ ans > 1 มิฉะนั้น false

ตัวอย่างโค้ด C++

#include <bits/stdc++.h> 
using namespace std; 

class Solution { 
public: 
    bool hasGroupsSizeX(vector<int>& deck) { 
        unordered_map<int, int> mp; 
        int ans; 
        for (auto x : deck) 
            mp[x]++; 
        for (auto x : mp) 
            ans = __gcd(ans, x.second); 
        return (ans > 1); 
    } 
}; 

int main(){ 
    Solution ob; 
    vector<int> v = {1,2,3,4,4,3,2,1}; 
    cout << (ob.hasGroupsSizeX(v)); 
}

อินพุต

{1,2,3,4,4,3,2,1}

เอาต์พุต

1