📜  电视机| TCS MockVita 2020

📅  最后修改于: 2021-04-26 18:55:13             🧑  作者: Mango

问题描述

Vishnu博士正在一个小镇开设一家新的世界级医院,该医院旨在成为该市患者的首选。医院有N间带电视和不带电视的两种类型的房间,每天的费用分别为R1R2。然而,根据他的经验,Vishnu博士知道全年的患者人数并不是恒定不变的,而是遵循一种规律。下式给出了一年中任何一天的患者人数:

所有患者更喜欢没有电视室,因为它们更便宜,但只有在没有电视室的情况下才会选择有电视室。医院的第一年运营目标是收入。给定此目标以及NR1R2的值,您需要确定医院应购买的电视数量,以使其达到收入目标。假设医院于1月1日开始营业,则该年份为非year年。

例子:

方法:想法是遍历全年并每天产生收入。找出每个可能拥有电视的客房数量,第一年的收入。请按照以下步骤解决问题:

  1. 假设有电视的房间总数为tvs ,其中0≤tvs≤N
  2. 对于电视的每个数字,可以通过遍历每一天来找到第一年的收入。
  3. 上面的公式可用于查找每天的患者人数。假设np是当前的患者人数。
  4. 当前的患者人数np可以具有今天的患者人数或房间总数的值,以最小者为准。
  5. 如果患者数量少于没有电视的房间数量,那么今天的总收入将是np * R1,因为它很便宜。
  6. 否则,如果患者人数大于没有电视的房间,那么今天的总收入为:
  7. 将每天的收入添加到目标值中,并打印检查所有可能的组合后生成的最大目标值。

下面是上述方法的实现:

C++
// C++ program for the above approach
  
#include 
using namespace std;
  
// Function that returns number of
// patient for a day in a month
int getPatients(int M, int D)
{
    return ((6 - M) * (6 - M))
           + abs(D - 15);
}
  
// Function that count the TVs with
// given amount of revenue target
void countTVs(long long n, long long r1,
              long long r2, long long target)
{
    long long np, tvs, current_target;
  
    // Days in each month
    vector days = { 0, 31, 28, 31,
                         30, 31, 30, 31,
                         31, 30, 31, 30,
                         31 };
  
    // Check all possible combinations
    for (tvs = 0; tvs <= n; tvs++) {
  
        // Stores the current target
        current_target = 0;
  
        for (int m = 1; m <= 12; m++) {
  
            for (int d = 1;
                 d <= days[m]; d++) {
  
                // Number of patients
                // on day d of month m
                np = getPatients(m, d);
  
                // Patients cannot be
                // exceed number of rooms
                np = min(np, n);
  
                // If the number of patient is
                // <= count of rooms without tv
                if (np <= n - tvs) {
  
                    // All patients will opt
                    // for rooms without tv
                    current_target += np * r2;
                }
  
                // Otherwise
                else {
  
                    // Some will opt for
                    // rooms with tv and
                    // others without tv
                    current_target
                        += ((n - tvs) * r2
                            + ((np - (n - tvs))
                               * r1));
                }
            }
        }
  
        // If current target meets
        // the required target
        if (current_target >= target) {
            break;
        }
    }
  
    // Print the count of TVs
    cout << min(tvs, n);
}
  
// Driver Code
int main()
{
    long long N = 20, R1 = 1500;
    long long R2 = 1000;
    long long target = 7000000;
  
    // Function Call
    countTVs(N, R1, R2, target);
  
    return 0;
}


输出:
14

时间复杂度: O(N * 365),其中N是给定的房间数。
辅助空间: O(1)