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

จำนวนคนสูงสุดใน C++


สมมติว่าเรามีเมทริกซ์ M ที่มีขนาด กว้าง x สูง ซึ่งทุกเซลล์มีค่า 0 หรือ 1 และเมทริกซ์ย่อยสี่เหลี่ยมใดๆ ของ M ที่มีขนาด l x l มีจำนวนสูงสุด maxOnes เราต้องหาจำนวนสูงสุดของเมทริกซ์ M ที่เป็นไปได้

ดังนั้น หากอินพุตเป็น w =3, h =3, l =2, maxOnes =1 ผลลัพธ์จะเป็น 4 เช่นเดียวกับในเมทริกซ์ 3*3 ไม่มีเมทริกซ์ย่อย 2*2 ตัวที่มีมากกว่า 1 ตัว . ทางออกที่ดีที่สุดที่มี 4 ข้อคือ −

1 0 1
0 0 0
1 0 1

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

  • ยกเลิก :=0

  • สร้างตารางอาร์เรย์ 2 มิติหนึ่งขนาด n x n

  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน <ความสูง อัปเดต (เพิ่ม i ขึ้น 1) ทำ -

    • สำหรับการเริ่มต้น j :=0 เมื่อ j

      • เพิ่ม sq[i mod n, j mod n] ขึ้น 1

  • กำหนดอาร์เรย์ v

  • สำหรับการเริ่มต้น i :=0 เมื่อ i

    • สำหรับการเริ่มต้น j :=0 เมื่อ j

      • ใส่ sq[i, j] ต่อท้าย v

  • เรียงลำดับอาร์เรย์ v ในลำดับย้อนกลับ

  • สำหรับการเริ่มต้น i :=0, j :=0 เมื่อ i <ขนาดของ v และ j

  • รีเทิร์น

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maximumNumberOfOnes(int width, int height, int n, int maxOnes) {
      int ret = 0;
      vector < vector <int> > sq(n, vector <int>(n));
      for(int i = 0; i < height; i++){
         for(int j = 0; j < width; j++){
            sq[i % n][j % n]++;
         }
      }
      vector <int> v;
      for(int i = 0; i < n; i++){
         for(int j = 0; j < n ; j++){
            v.push_back(sq[i][j]);
         }
      }
      sort(v.rbegin(), v.rend());
      for(int i = 0, j = 0; i < v.size() && j < maxOnes; i++, j++){
         ret += v[i];
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.maximumNumberOfOnes(3,3,2,1));
}

อินพุต

3, 3, 2, 1

ผลลัพธ์

4