TACHSTCK - Editorial

Problem Link:

Practice
Contest

Difficulty:

Cakewalk

Pre-requisites:

Ad Hoc

Problem:

Given N sticks of lengths L[1], L[2], … L[N] and a positive integer D.
Two sticks can be paired if the difference of their lengths is at most D.
Pair up as many sticks as possible such that each stick is used at most once.

Quick Explanation:

Sort the sticks by their lengths and let L be the sorted array.

If L[1] and L[2] cannot be paired, then the stick L[1] is useless.
Otherwise, there exists an optimal pairing where L[1] gets paired with L[2].

This gives rise to the following algorithm:


numpairs = 0
for ( i = 1; i < N; )
    if (L[i] >= L[i+1] -D)  // L[1] and L[2] can be paired
        numpairs++,         // pair them up
        i += 2;
    else
        i++;                // eliminate L[1]

Justifications:

  • If L[1] and L[2] cannot be paired then
           L[1] < L[2] - D
    But, L[2] <= L[i] for every i > 1
    So    L[1] < L[i] - D for every i > 1
    Hence, L[1] cannot be paired with anyone.

  • If L[1] and L[2] can be paired.
        Consider any optimal pairing and it can be transformed to a pairing where L[1] and L[2] are paired.
            a) If the optimal pairing pairs L[1] with L[2] then we are done.
            b) If only one of L[1] and L[2] is paired with someone, then we can replace that pair by (L[1], L[2]).
            c) If both L[1] and L[2] are paired and L[1] is paired with L[n] and L[2] with L[m], then we might as well form pairs (L[1], L[2]) and (L[n], L[m]).
                This is because
                    L[2] <= L[m] <= L[2] + D
                    L[2] <= L[n] <= L[1] + D <= L[2] + D
              ⇒   -D <= L[m] - L[n] <= D

Setter’s Solution:

Can be found here

Tester’s Solution:

Can be found here

6 Likes

why my solution is giving TLE?
http://www.codechef.com/viewsolution/4361912

//what is wrong with this

#include
#include
#define ll long long
using namespace std;
int main()
{
ll n,d;
cin>>n>>d;
ll a[n];
for(ll i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
ll cnt=0;
for(ll i=0;i<n;i++)
{
if(a[i+1]-a[i]<=d)
{
cnt++;
i+=1;
}

}
cout<<cnt<<endl;
return 0;

}

@anichavan20
you are accessing nth element of array,
which is throwing some garbage value…

when i=n-1,you try to compute a[n]-a[n-1]…

solve this…
you may try this CodeChef: Practical coding for everyone

https://www.codechef.com/viewsolution/12375437
Can someone please help what is wrong with this??
Thank you.

I have done with this can you please provide some more test case for this problem.

Why my code is wrong : CodeChef: Practical coding for everyone

fix cook tag please

If L[1] and L[2] cannot be paired then
L[1] < L[2] + D
If L[1]=L[2]+D-1. Then (L[2]-L[1])=1-D <=D
It should be L[1]<L[2]-D .

@maggu you are right. fixed.

/* package codechef; // don’t place package name! */

import java.util.;
import java.lang.
;
import java.io.;
import java.util.Arrays;
/
Name of the class has to be “Main” only if the class is public. */
class Codechef
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
Scanner sc= new Scanner(System.in);
int n,d,c=0,j=0;
n=sc.nextInt();
d=sc.nextInt();
int len[]=new int[n];
for(int i=0;i<n;i++)
{
len[i]=sc.nextInt();
}
Arrays.sort(len);
while(j<n-1)
{
if((len[j]-len[j+1])<=d)
{
c++;
j+=2;

	    }
	    else
	    {
	        j+=1;
	    }
	}
	System.out.println(c);
}

}

Can someone help me. What is wrong with this solution?It is running in other editors but codechef is not submitting it .

#include
#include <bits/stdc++.h>
using namespace std;

int main() {
long n,d;
cin >> n;
cin >> d;
long arr[n];
int count=0;
for(int i=1;i<=n;i++){
cin >> arr[i];
}
int i=1;
int j=1;
long int max=0;
while(i<n)
{
j=i+1;
for(int m=j;m<=n;m++)
{
if(abs(arr[m]-arr[i])<=d)
{
count+=1;
max+=99;
arr[m]= max;
max+=99;
arr[i]=max;
break;
}
}
i++;
}

cout << count;
return 0;

}

Giving TLE!!

This part of your code does not logically agree to the question. Also, you should increase the array size of arr[] by 1 else accessing arr[n] may return some garbage value.

#include <stdio.h>

int main(void)
{
// your code goes here
int n;
long d;
scanf("%d %ld",&n,&d);
int l[n];
int i;
for(i=0;i<n;i++)
{
scanf("%d",&l[i]);
}
i=0;
int k=0;
int j;
while(i<n-1)
{
for(j=i+1;j<n;j++)
{
if(l[i]>l[j])
{
if(d>=(l[i]-l[j]))
{
k++;
l[j]=‘x’;
break;

            }
        }
        else
        {
            if(d>=(l[j]-l[i]))
            {
                k++;
                l[j]='x';
                break;
                
            }
        }
    }
    i++;
}
printf("%d\n",k);
return 0;

}

whats wrong in this can anyone explain me ??

Please give the link to your code[s].

here it is

https://www.codechef.com/viewsolution/26108040

https://www.codechef.com/viewsolution/23140726

I understood what your code is doing, but not to ‘EXACTLY’ tell you that, here is a test case where your code is failing
4 1
1 2 121 121

Your output- 3.
Correct output- 2.

Try yourself and then look at the hints below.

Hint 1

There is a bug in line numbers 27 and 37

Hint 2

Initialize the l[i] to INT_MIN. That will prevent the error. Why this is happening coz the value of ‘x’ is 120 if you go to ascii chart. So, you are initializing l[i] to 120 everyone the difference is smaller. Initializing it to INT_MIN will solve the probelm

Hope this helps and please try yourself before looking at the hints.:slight_smile:

1 Like

Can someone help me in optimizing the code, it gives TLE.
https://www.codechef.com/viewsolution/27720823