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

เพื่อนวัยที่เหมาะสมในภาษา C++


สมมติว่าบางคนจะขอเป็นเพื่อน เรารู้อายุของพวกเขา สิ่งเหล่านี้ถูกเก็บไว้ในวัย[i] นี่แสดงว่าอายุของบุคคลนั้น ตอนนี้ A จะไม่ขอเป็นเพื่อนกับบุคคล B (B !=A) หากเงื่อนไขใด ๆ ต่อไปนี้เป็นจริง -

  • อายุ[B] <=0.5 * อายุ[A] + 7
  • อายุ[B]>อายุ[A]
  • อายุ[B]> 100 &&อายุ[A] <100

มิฉะนั้น A จะขอเป็นเพื่อน B. คุณสามารถพิจารณาว่าถ้า A ขอ B, B ไม่จำเป็นต้องขอ A. และคนจะไม่ขอเป็นเพื่อนเอง เราจึงต้องหาว่ามีการขอเป็นเพื่อนทั้งหมดกี่คน?

สมมติว่าอาร์เรย์อายุเท่ากับ [16,17,18] ผลลัพธ์จะเป็น 2 เนื่องจากคำขอจะเป็น 17 -> 16, 18 -> 17

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

  • กำหนดที่เก็บข้อมูลอาร์เรย์ขนาด 1000 จากนั้นเก็บความถี่ขององค์ประกอบอาร์เรย์อายุไว้ในที่เก็บข้อมูล
  • จากนั้นค้นหาและจัดเก็บผลรวมขององค์ประกอบที่เก็บข้อมูลไว้ในที่เก็บข้อมูล
  • ret :=0
  • สำหรับฉันอยู่ในช่วง 0 ถึงขนาดอาร์เรย์อายุ – 1
    • x :=อายุ[i], y :=(อายุ[i] / 2) + 7
    • ถ้า x>=y แล้ว
      • ret :=bucket[x] – bucket[y]
      • ถ้า bucket[x] – bucket[y] ไม่ใช่ศูนย์ ให้ลดการ ret ลง 1
  • คืนสินค้า

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int numFriendRequests(vector<int>& ages) {
      vector <int> bucket(1000);
      for(int i = 0; i < ages.size(); i++){
         bucket[ages[i]]++;
      }
      for(int i = 1; i < 1000; i++)bucket[i] += bucket[i - 1];
      int ret = 0;
      for(int i = 0; i < ages.size(); i++){
         int x = ages[i];
         int y = ((ages[i]) / 2) + 7;
         if(x >= y){
            ret += (bucket[x] - bucket[y]);
            if((bucket[x] - bucket[y]))
            ret--;
         }
      }
      return ret;
   }
};
main(){
   vector<int> v1 = {16, 17, 18};
   Solution ob;
   cout << (ob.numFriendRequests(v1));
}

อินพุต

[16,17,18]

ผลลัพธ์

2