Problem:
Score : 300 points

Problem Statement

You are given an integer sequence of length N, a_1,a_2,...,a_N.

For each 1≤i≤N, you have three choices: add 1 to a_i, subtract 1 from a_i or do nothing.

After these operations, you select an integer X and count the number of i such that a_i=X.

Maximize this count by making optimal choices.

Constraints

1≤N≤10^5

0≤a_i<10^5 (1≤i≤N)

a_i is an integer.

Input

The input is given from Standard Input in the following format:

N
a_1 a_2 .. a_N

Output

Print the maximum possible number of i such that a_i=X.

Sample Input 1

7
3 1 4 1 5 9 2

Sample Output 1

4

For example, turn the sequence into 2,2,3,2,6,9,2 and select X=2 to obtain 4, the maximum possible count.

Sample Input 2

10
0 1 2 3 4 5 6 7 8 9

Sample Output 2

3

Sample Input 3

1
99999

Sample Output 3

1

Solution in Java7 (OpenJDK 1.7.0) (judge verdict: Wrong Answer)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {

	// Atcoder用のサンプルプログラム
	public static void main(String[] args) {
		String line = "";
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			line = br.readLine();

			StringTokenizer st0 = new StringTokenizer(line, "");
			int cnt0=Integer.parseInt(st0.nextToken());
			
			line = br.readLine();
			StringTokenizer st = new StringTokenizer(line, " ");
			
			String s = "";
			Map<String,Integer> stringMap = new HashMap<String,Integer>();
			int[] hairetu=new int[cnt0];
			int hairetuMax=0;
			for (int i = 0; i < cnt0;i++) {
				
				s= st.nextToken();
				hairetu[i]=Integer.parseInt(s);
				//System.out.println(s);
				if (stringMap.get(s)==null) {
					stringMap.put(s, 1);
				} else {
					stringMap.put(s, stringMap.get(s)+1);
				}
				if(hairetuMax<hairetu[i]) {
					hairetuMax=hairetu[i];
				}
				
			}
			
			int max=0;
			int maxSuji=0; // maxになったときの0-8の数字
			int temp=0;
			
			for (int j=1;j < hairetuMax;j++) {
				temp=0;
				
				if (j==1) {
					
					if (stringMap.get("1")!=null) {
						temp=temp+stringMap.get("1");	
						
					}
					if (stringMap.get("2")!=null) {
						temp=temp+stringMap.get("2");	
					}
					
				} else if (j==9) {
					if (stringMap.get("8")!=null) {
						temp=temp+stringMap.get("8");	
					}
					if (stringMap.get("9")!=null) {
						temp=temp+stringMap.get("9");	
						System.out.println(temp);
					}
				} else {
					if (stringMap.get(String.valueOf(j-1))!=null) {
						temp=temp+stringMap.get(String.valueOf(j-1));	
					}
					if (stringMap.get(String.valueOf(j))!=null) {
						temp=temp+stringMap.get(String.valueOf(j));	
					}
					if (stringMap.get(String.valueOf(j+1))!=null) {
						temp=temp+stringMap.get(String.valueOf(j+1));	
					}
				}
				if (temp > max) {
					//System.out.println(temp + " " + max);
					//System.out.println(j);
					max=temp;
					maxSuji=j;
				}
			}
			
			int x = 0;
			for (int i = 0; i < cnt0;i++) {
				//System.out.println(hairetu[i]);
				if (maxSuji-1 ==hairetu[i] || maxSuji ==hairetu[i] || maxSuji+1 ==hairetu[i]) {
					x++;
				}
			}
			
			
			
			
			//String tempS = st.nextToken();

			//int k = Integer.parseInt(tempK);
			//int s = Integer.parseInt(tempS);
			
			//String result="";
            /*StringBuffer sb = new StringBuffer();
            
			for (int i =0;i<s.length();i++) {
				if (i % 2 == 0) {
					//result = result + s.charAt(i);
                    sb.append(s.charAt(i));
				}
			}
			System.out.println(sb.toString());
			*/
			System.out.println(x);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


}