After the lessons n groups of schoolchildren went outside and decided to visit Polycarpus to celebrate his birthday. We know that the i-th group consists of si friends (1 ≤ si ≤ 4), and they want to go to Polycarpus together. They decided to get there by taxi. Each car can carry at most four passengers. What minimum number of cars will the children need if all members of each group should ride in the same taxi (but one taxi can take more than one group)?
Input
The first line contains integer n (1 ≤ n ≤ 105) — the number of groups of schoolchildren. The second line contains a sequence of integers s1, s2, …, sn (1 ≤ si ≤ 4). The integers are separated by a space, si is the number of children in the i-th group.
Output
Print the single number — the minimum number of taxis necessary to drive all children to Polycarpus.
Examples
Input
5 1 2 4 3 3
Output
4
Input
8 2 3 4 4 2 1 3 1
Output
5
Solution
C# Solution
In my initial attempt, I utilized an array and its indices to calculate the number of taxis.
However, this approach proved to be time-consuming.
Therefore, I recognized the necessity to find an alternative solution.
First try – Time limit exceeded
int n = int.Parse(Console.ReadLine()); //number of groups
int[] arr = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
int carCnt = 0;
for(int i=0; i<arr.Length;i++){
int num = arr[i]; // number of children in the group
if(num==4){
carCnt+=1;
arr[i] = 0;
}
else if(num==3){
var idx = Array.IndexOf(arr,1);
if(idx>-1){
carCnt+=1;
arr[i] = 0;
arr[idx] = 0;
}
}
else if(num==2){
var idx = Array.LastIndexOf(arr,2);
if(idx>-1 && idx != i){
carCnt+=1;
arr[i] = 0;
arr[idx] = 0;
continue;
}
idx = Array.IndexOf(arr,1);
if(idx>-1){
arr[i] = 0;
arr[idx] = 3;
}
}
else if(num==1) {
var idx = Array.IndexOf(arr,3);
if(idx>-1){
carCnt+=1;
arr[i] = 0;
arr[idx] = 0;
continue;
}
idx = Array.LastIndexOf(arr,2);
if(idx>-1){
arr[i] = 0;
arr[idx] = 3;
continue;
}
idx = Array.LastIndexOf(arr,1);
if(idx>-1 && idx != i){
arr[i] = 0;
arr[idx] = 2;
continue;
}
}
}
int nonZeroCount = arr.Count(x => x > 0);
Console.WriteLine(carCnt+nonZeroCount);
Solution1
int n = int.Parse(Console.ReadLine()); //number of groups
int[] arr = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
int carCnt = 0;
int cnt1 = 0;
int cnt2 = 0;
int cnt3 = 0;
foreach(var a in arr){
if(a==1){
cnt1+=1;
}
else if(a==2){
cnt2+=1;
}
else if(a==3){
cnt3+=1;
}
else{ //4
carCnt+=1;
}
}
while(cnt3>0 && cnt1>0){
cnt3-=1;
cnt1-=1;
carCnt+=1;
}
while(cnt1>1){
cnt1-=2;
cnt2+=1;
}
while(cnt2>1){
cnt2-=2;
carCnt+=1;
}
// If there is exactly one cnt1 and one cnt2, they can be combined into one taxi
if(cnt1==1 && cnt2==1){
Console.WriteLine(carCnt+1+cnt3);
}
else{
Console.WriteLine(carCnt+cnt1+cnt2+cnt3);
}
The while loop while(cnt3 > 0 && cnt1 > 0) is there to pair groups of 1 child (cnt1) with groups of 3 children (cnt3) into taxis as long as there are both kinds available.
And in the next while loop, we combine two groups with 1 child each, treating them as a single group with 2 children for the subsequent evaluation.
In the following while loop(cnt2>1), we pair two groups with 2 children each, treating them as a single group with 4 children for counting taxis.
In the last if-else, we handle the final taxi count based on the remaining groups efficiently.
var uagb_data = {"ajax_url":"https:\/\/zyrastory.com\/wp-admin\/admin-ajax.php","uagb_masonry_ajax_nonce":"b90f501051"};
var uagb_data = {"ajax_url":"https:\/\/zyrastory.com\/wp-admin\/admin-ajax.php","uagb_masonry_ajax_nonce":"b90f501051","uagb_grid_ajax_nonce":"ba32b183e3"};
( function() {
let elements = document.querySelectorAll( '.uagb-post-grid.uagb-block-613bccac .uagb-post-pagination-wrap a' );
elements.forEach(function(element) {
element.addEventListener("click", function(event){
event.preventDefault();
const link = event.target.getAttribute('href').match( /\/page\/\d+\// )?.[0] || '';
const regex = /\d+/; // regular expression to match a number at the end of the string
const match = link.match( regex ) ? link.match( regex )[0] : 1; // match the regular expression with the link
const pageNumber = parseInt( match ); // extract the number and parse it to an integer
window.UAGBPostGrid._callAjax({"btnBorderStyle":"none","overallBorderColor":"","block_id":"613bccac","categories":"60","displayPostExcerpt":false,"displayPostComment":false,"displayPostImage":false,"imgSize":"medium","linkBox":false,"orderBy":"rand","excludeCurrentPost":true,"postPagination":true,"pageLimit":0,"imageRatio":"2-3","imgEqualHeight":true,"btnBorderLink":true,"btnBorderRadiusLink":true,"overallBorderLink":true,"overallBorderRadiusLink":true,"inheritFromTheme":true,"postType":"post","postDisplaytext":"No post found!","taxonomyType":"category","postsToShow":6,"enableOffset":false,"postsOffset":0,"displayPostDate":true,"excerptLength":15,"displayPostAuthor":false,"displayPostTitle":true,"displayPostTaxonomy":false,"hideTaxonomyIcon":true,"taxStyle":"default","displayPostTaxonomyAboveTitle":"withMeta","imgPosition":"top","bgOverlayColor":"#000000","overlayOpacity":"50","displayPostLink":true,"newTab":false,"ctaText":"Read More","btnHPadding":"","btnVPadding":"","columns":3,"tcolumns":2,"mcolumns":1,"align":"left","width":"wide","order":"desc","rowGap":20,"rowGapTablet":20,"rowGapMobile":20,"columnGap":20,"bgType":"color","bgColor":"#f6f6f6","titleTag":"h4","titleFontSize":"","titleFontSizeType":"px","titleFontFamily":"","titleLineHeightType":"em","titleLoadGoogleFonts":false,"metaColor":"","highlightedTextColor":"#fff","highlightedTextBgColor":"#3182ce","metaFontSize":"","metaFontSizeType":"px","metaFontFamily":"","metaLineHeightType":"em","metaLoadGoogleFonts":false,"excerptColor":"","excerptFontSize":"","excerptFontSizeType":"px","excerptFontFamily":"","excerptLineHeightType":"em","excerptLoadGoogleFonts":false,"displayPostContentRadio":"excerpt","ctaBgType":"color","ctaBgHType":"color","ctaFontSize":"","ctaFontSizeType":"px","ctaFontFamily":"","ctaLineHeightType":"em","ctaLoadGoogleFonts":false,"paddingTop":20,"paddingBottom":20,"paddingRight":20,"paddingLeft":20,"contentPadding":20,"ctaBottomSpace":0,"ctaBottomSpaceTablet":0,"ctaBottomSpaceMobile":0,"imageBottomSpace":15,"titleBottomSpace":15,"metaBottomSpace":15,"excerptBottomSpace":25,"contentPaddingUnit":"px","rowGapUnit":"px","columnGapUnit":"px","excerptBottomSpaceUnit":"px","paginationSpacingUnit":"px","imageBottomSpaceUnit":"px","titleBottomSpaceUnit":"px","metaBottomSpaceUnit":"px","ctaBottomSpaceUnit":"px","paddingBtnUnit":"px","mobilePaddingBtnUnit":"px","tabletPaddingBtnUnit":"px","paddingUnit":"px","mobilePaddingUnit":"px","tabletPaddingUnit":"px","isPreview":false,"taxDivider":", ","titleLetterSpacing":"","titleLetterSpacingType":"px","metaLetterSpacing":"","metaLetterSpacingType":"px","ctaLetterSpacing":"","ctaLetterSpacingType":"px","excerptLetterSpacing":"","excerptLetterSpacingType":"px","useSeparateBoxShadows":true,"boxShadowColor":"#00000070","boxShadowHOffset":0,"boxShadowVOffset":0,"boxShadowBlur":"","boxShadowSpread":"","boxShadowPosition":"outset","boxShadowColorHover":"","boxShadowHOffsetHover":0,"boxShadowVOffsetHover":0,"boxShadowBlurHover":"","boxShadowSpreadHover":"","boxShadowPositionHover":"outset","borderWidth":"","borderStyle":"none","borderColor":"","borderRadius":"","blockName":"post-grid","equalHeight":true,"paginationBgActiveColor":"#e4e4e4","paginationActiveColor":"#333333","paginationBgColor":"#e4e4e4","paginationColor":"#777777","paginationMarkup":"","paginationLayout":"filled","paginationBorderColor":"#888686","paginationBorderSize":1,"paginationSpacing":20,"paginationAlignment":"left","paginationPrevText":"\u00ab Previous","paginationNextText":"Next \u00bb","layoutConfig":[["uagb\/post-image"],["uagb\/post-taxonomy"],["uagb\/post-title"],["uagb\/post-meta"],["uagb\/post-excerpt"],["uagb\/post-button"]],"post_type":"grid","equalHeightInlineButtons":false,"paginationType":"ajax","extended_widget_opts_block":{},"extended_widget_opts":{},"extended_widget_opts_state":"","extended_widget_opts_clientid":"","dateUpdated":""}, pageNumber, '613bccac');
});
});
} )();
ai_front = {"insertion_before":"BEFORE","insertion_after":"AFTER","insertion_prepend":"PREPEND CONTENT","insertion_append":"APPEND CONTENT","insertion_replace_content":"REPLACE CONTENT","insertion_replace_element":"REPLACE ELEMENT","visible":"VISIBLE","hidden":"HIDDEN","fallback":"FALLBACK","automatically_placed":"Automatically placed by AdSense Auto ads code","cancel":"Cancel","use":"Use","add":"Add","parent":"Parent","cancel_element_selection":"Cancel element selection","select_parent_element":"Select parent element","css_selector":"CSS selector","use_current_selector":"Use current selector","element":"ELEMENT","path":"PATH","selector":"SELECTOR"};