Skip to content
Related Articles
Get the best out of our app
GFG App
Open App
geeksforgeeks
Browser
Continue

Related Articles

Calculate total wall area of houses painted

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

Given integers N, L and W representing number of rows and length and width of houses in each row, and an array Heights[], representing the height of each house, the task is to find the total area of the outer walls required to be painted if the adjacent houses share a common wall.

Examples:

Input: N = 4, W = 1, L = 1, Heights[] = {1, 2, 3, 4}
Output: 28
Explanation: 
The area of house-1 painted = 2 * 1 + 1 * 1 = 3 
The area of house-2 painted = 2 * 2 + 1 * 1 = 5 
The area of house-3 painted = 2 * 3 + 1 * 1 = 7 
The area of house-4 painted = 2 * 4 + 1 * 1 + 1 * 4 = 13 
Therefore, the total area painted = 28 
 

Input: N = 7, W = 1, L = 1, Heights[] = {4, 3, 1, 2, 3, 4, 2}
Output: 52

Approach: The problem can be solved using Greedy technique. Follow the steps below to solve the problem:

  • The total area of the wall of the first house painted is equal to 2 * w * h1 + l * (h1 + max(0, h2 – h1)).
  • The total area of the wall of the last house painted is equal to 2 * w * hn + l * (hn + max(0, hn – hn-1)).
  • The total area of the wall of the house painted other than the first and the last houses is equal to 2 * w * hi + l * (max(0, hi – hi + 1) + max(0, hi – hi-1)).
  • Therefore, the total area of all the houses painted will be calculated using the following formula: 
     

Total area printed = 2 * w(h1 + …+hn) + l(h1 + hn) + l * Σabs(hi – hi-1). 
 

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the total area
// of walls painted in N row-houses
void areaToPaint(int N, int W, int L,
                 int Heights[])
{
 
    // Stores total area of N row-houses
    // that needs to be painted
    int total = 0;
 
    // Traverse the array of wall heights
    for (int i = 0; i < N; i++) {
 
        // Update total area painted
        total += 2 * Heights[i] * W;
    }
 
    // Update total
    total += L * (Heights[0]
                  + Heights[N - 1]);
 
    // Traverse all the houses and
    // print the shared walls
    for (int i = 1; i < N; i++) {
 
        // Update total
        total += L * abs(Heights[i]
                         - Heights[i - 1]);
    }
 
    // Print total area needs to paint
    cout << total;
}
 
// Driver Code
int main()
{
 
    // Given N, W & L
    int N = 7, W = 1, L = 1;
 
    // Given heights of houses
    int Heights[N]
        = { 4, 3, 1, 2, 3, 4, 2 };
 
    // Function Call
    areaToPaint(N, W, L, Heights);
}


Java




// Java code of above approach
import java.util.*;
class GFG {
 
  // Function to find the total area
  // of walls painted in N row-houses
  static void areaToPaint(int N, int W, int L,
                          int Heights[])
  {
 
    // Stores total area of N row-houses
    // that needs to be painted
    int total = 0;
 
    // Traverse the array of wall heights
    for (int i = 0; i < N; i++) {
 
      // Update total area painted
      total += 2 * Heights[i] * W;
    }
 
    // Update total
    total += L * (Heights[0]
                  + Heights[N - 1]);
 
    // Traverse all the houses and
    // print the shared walls
    for (int i = 1; i < N; i++) {
 
      // Update total
      total += L * Math.abs(Heights[i]
                            - Heights[i - 1]);
    }
 
    // Print total area needs to paint
    System.out.print(total);
  }
 
  // Driver code
  public static void main(String[] args)
  {
    // Given N, W & L
    int N = 7, W = 1, L = 1;
 
    // Given heights of houses
    int Heights[]
      = { 4, 3, 1, 2, 3, 4, 2 };
 
    // Function Call
    areaToPaint(N, W, L, Heights);
  }
}
 
// This code is contributed by offbeat


Python3




# Python 3 program for the above approach
 
# Function to find the total area
# of walls painted in N row-houses
def areaToPaint(N, W, L, Heights):
 
    # Stores total area of N row-houses
    # that needs to be painted
    total = 0
 
    # Traverse the array of wall heights
    for i in range(N):
 
        # Update total area painted
        total += 2 * Heights[i] * W
 
    # Update total
    total += L * (Heights[0]
                  + Heights[N - 1])
 
    # Traverse all the houses and
    # print the shared walls
    for i in range(1, N):
 
        # Update total
        total += L * abs(Heights[i]
                         - Heights[i - 1])
 
    # Print total area needs to paint
    print(total)
 
 
# Driver Code
if __name__ == "__main__":
 
    # Given N, W & L
    N = 7
    W = 1
    L = 1
 
    # Given heights of houses
    Heights = [4, 3, 1, 2, 3, 4, 2]
 
    # Function Call
    areaToPaint(N, W, L, Heights)
 
    # This code is contributed by chitranayal.


C#




// C# program for the above approach
using System;
  
class GFG{
  
// Function to find the total area
// of walls painted in N row-houses
static void areaToPaint(int N, int W, int L, int[] Heights)
{
    // Stores total area of N row-houses
    // that needs to be painted
    int total = 0;
 
    // Traverse the array of wall heights
    for (int i = 0; i < N; i++) {
 
        // Update total area painted
        total += 2 * Heights[i] * W;
    }
 
    // Update total
    total += L * (Heights[0] + Heights[N - 1]);
 
    // Traverse all the houses and
    // print the shared walls
    for (int i = 1; i < N; i++) {
 
        // Update total
        total += L * Math.Abs(Heights[i] - Heights[i - 1]);
    }
 
    // Print total area needs to paint
    Console.Write(total);
}
  
// Driver Code
public static void Main(String[] args)
{
  
    // Given N, W & L
    int N = 7, W = 1, L = 1;
 
    // Given heights of houses
    int[] Heights = { 4, 3, 1, 2, 3, 4, 2 };
 
    // Function Call
    areaToPaint(N, W, L, Heights);
}
}
  
// This code is contributed by aditya942003patil


Javascript




<script>
 
// JavaScript code of above approach
 
// Function to find the total area
  // of walls painted in N row-houses
function areaToPaint(N,W,L,Heights)
{
    // Stores total area of N row-houses
    // that needs to be painted
    let total = 0;
  
    // Traverse the array of wall heights
    for (let i = 0; i < N; i++) {
  
      // Update total area painted
      total += 2 * Heights[i] * W;
    }
  
    // Update total
    total += L * (Heights[0]
                  + Heights[N - 1]);
  
    // Traverse all the houses and
    // print the shared walls
    for (let i = 1; i < N; i++) {
  
      // Update total
      total += L * Math.abs(Heights[i]
                            - Heights[i - 1]);
    }
  
    // Print total area needs to paint
    document.write(total);
}
 
// Driver code
// Given N, W & L
let N = 7, W = 1, L = 1;
 
// Given heights of houses
let Heights
= [ 4, 3, 1, 2, 3, 4, 2 ];
 
// Function Call
areaToPaint(N, W, L, Heights);
 
 
// This code is contributed by avanitrachhadiya2155
 
</script>


Output: 

52

 

Time Complexity: O(N)
Auxiliary Space: O(1)


My Personal Notes arrow_drop_up
Last Updated : 29 Jul, 2022
Like Article
Save Article
Similar Reads
Related Tutorials