求每次迭代后剩余棒的总和
给定阵列中不同长度的棒的数量,任务是确定每次迭代后剩余棒的总数。每次迭代时,从剩余的棒中剪下最短的棒。
示例:
Input: N = 6, arr = {5, 4, 4, 2, 2, 8}
Output: 7
Explanation:
Iteration 1:
Initial arr = {5, 4, 4, 2, 2, 8}
Shortest stick = 2
arr with reduced length = {3, 2, 2, 0, 0, 6}
Remaining sticks = 4
Iteration 2:
arr = {3, 2, 2, 4}
Shortest stick = 2
Left stick = 2
Iteration 3:
arr = {1, 2}
Shortest stick = 1
Left stick = 1
Iteration 4:
arr = {1}
Min length = 1
Left stick = 0
Input: N = 8, arr = {1, 2, 3, 4, 3, 3, 2, 1}
Output: 11
方法:解决这个问题的方法是对数组进行排序,然后在遍历时找到相同长度的最小长度棒的数量,并在每一步相应地更新总和,最后返回总和。
C++
// C++ program to find the sum of
// remaining sticks after each iterations
#include <bits/stdc++.h>
using namespace std;
// Function to calculate
// sum of remaining sticks
// after each iteration
int sum(vector<int> &arr, int n)
{
int sum = 0;
sort(arr.begin(),arr.end());
int prev=0,count=1,s=arr.size();
int i=1;
while(i<arr.size()){
if(arr[i]==arr[prev]){
count++;
}else{
prev=i;
sum+=s-count;
s-=count;
count=1;
}
i++;
}
return sum;
}
// Driver code
int main()
{
int n = 6;
vector<int> ar{ 5, 4, 4, 2, 2, 8 };
int ans = sum(ar, n);
cout << ans << '\n';
return 0;
}
Java 语言(一种计算机语言,尤用于创建网站)
// Java program to find the sum of
// remaining sticks after each iterations
import java.io.*;
import java.util.*;
class GFG{
// Function to calculate
// sum of remaining sticks
// after each iteration
public static int sum(int arr[], int n)
{
int sum = 0;
Arrays.sort(arr);
int prev = 0, count = 1, s = n;
int i = 1;
while (i < n)
{
if (arr[i] == arr[prev])
{
count++;
}
else
{
prev = i;
sum += s - count;
s -= count;
count = 1;
}
i++;
}
return sum;
}
// Driver code
public static void main(String[] args)
{
int n = 6;
int ar[] = { 5, 4, 4, 2, 2, 8 };
int ans = sum(ar, n);
System.out.println(ans);
}
}
// This code is contributed by Manu Pathria
java 描述语言
<script>
// Java Script program to find the sum of
// remaining sticks after each iterations
// Function to calculate
// sum of remaining sticks
// after each iteration
function sum(arr,n)
{
let sum = 0;
arr.sort();
let prev = 0, count = 1, s = n;
let i = 1;
while (i < n)
{
if (arr[i] == arr[prev])
{
count++;
}
else
{
prev = i;
sum += s - count;
s -= count;
count = 1;
}
i++;
}
return sum;
}
// Driver code
let n = 6;
let ar = [ 5, 4, 4, 2, 2, 8 ];
let ans = sum(ar, n);
document.write(ans);
// This code is contributed by manoj
</script>
时间复杂度 : O(Nlog(N)) 其中 N 为棍棒数。
另一种方法:
- 将杆长的频率存储在地图中
- 在每次迭代中,
- 找出最小长度棒的频率
- 从每个杆的频率中降低最小长度杆的频率
- 将非零棒数加到合成棒上。
下面是上述方法的实现:
C++
// C++ program to find the sum of
// remaining sticks after each iterations
#include <bits/stdc++.h>
using namespace std;
// Function to calculate
// sum of remaining sticks
// after each iteration
int sum(int ar[], int n)
{
map<int, int> mp;
// storing frequency of stick length
for (int i = 0; i < n; i++) {
mp[ar[i]]++;
}
int sum = 0;
for (auto p : mp) {
n -= p.second;
sum += n;
}
return sum;
}
// Driver code
int main()
{
int n = 6;
int ar[] = { 5, 4, 4, 2, 2, 8 };
int ans = sum(ar, n);
cout << ans << '\n';
return 0;
}
Java 语言(一种计算机语言,尤用于创建网站)
// Java program to find the sum of
// remaining sticks after each iterations
import java.util.HashMap;
import java.util.Map;
class GFG
{
// Function to calculate
// sum of remaining sticks
// after each iteration
static int sum(int ar[], int n)
{
HashMap<Integer,
Integer> mp = new HashMap<>();
for (int i = 0; i < n; i++)
{
mp.put(ar[i], 0);
}
// storing frequency of stick length
for (int i = 0; i < n; i++)
{
mp.put(ar[i], mp.get(ar[i]) + 1) ;
}
int sum = 0;
for(Map.Entry p : mp.entrySet())
{
n -= (int)p.getValue();
sum += n;
}
return sum;
}
// Driver code
public static void main (String[] args)
{
int n = 6;
int ar[] = { 5, 4, 4, 2, 2, 8 };
int ans = sum(ar, n);
System.out.println(ans);
}
}
// This code is contributed by kanugargng
Python 3
# Python proagram to find sum
# of remaining sticks
# Function to calculate
# sum of remaining sticks
# after each iteration
def sum(ar, n):
mp = dict()
for i in ar:
if i in mp:
mp[i]+= 1
else:
mp[i] = 1
mp = sorted(list(mp.items()))
sum = 0
for pair in mp:
n-= pair[1]
sum+= n
return sum
# Driver code
def main():
n = 6
ar = [5, 4, 4, 2, 2, 8]
ans = sum(ar, n)
print(ans)
main()
C
// C# program to find the sum of
// remaining sticks after each iterations
using System;
using System.Collections.Generic;
class GFG
{
// Function to calculate
// sum of remaining sticks
// after each iteration
static int sum(int []ar, int n)
{
SortedDictionary<int,
int> mp = new SortedDictionary<int,
int>();
// storing frequency of stick length
for (int i = 0; i < n; i++)
{
if(!mp.ContainsKey(ar[i]))
mp.Add(ar[i], 0);
else
mp[ar[i]] = 0;
}
// storing frequency of stick length
for (int i = 0; i < n; i++)
{
if(!mp.ContainsKey(ar[i]))
mp.Add(ar[i], 1);
else
mp[ar[i]] = ++mp[ar[i]];
}
int sum = 0;
foreach(KeyValuePair<int, int> p in mp)
{
n -= p.Value;
sum += n;
}
return sum;
}
// Driver code
public static void Main (String[] args)
{
int n = 6;
int []ar = { 5, 4, 4, 2, 2, 8 };
int ans = sum(ar, n);
Console.WriteLine(ans);
}
}
// This code is contributed by 29AjayKumar
java 描述语言
<script>
// Javascript program to find the sum of
// remaining sticks after each iterations
// Function to calculate
// sum of remaining sticks
// after each iteration
function sum(ar, n)
{
let mp = new Map();
for (let i = 0; i < n; i++)
{
mp.set(ar[i], 0);
}
// storing frequency of stick length
for (let i = 0; i < n; i++)
{
mp.set(ar[i], mp.get(ar[i]) + 1);
}
mp = new Map([...mp].sort((a, b) => String(a[0]).localeCompare(b[0])))
let sum = 0;
for (let p of mp)
{
n -= p[1]
sum += n;
}
return sum;
}
// Driver code
let n = 6;
let ar = [5, 4, 4, 2, 2, 8];
let ans = sum(ar, n);
document.write(ans + '<br>');
// This code is contributed by _saurabh_jaiswal.
</script>
Output:
7
时间复杂度: 其中 N 为棍棒数
版权属于:月萌API www.moonapi.com,转载请注明出处