Problem:
Movie

Problem

太郎君は夏休みの間、毎日１つの映画を近所の映画館で見ることにしました。
（太郎君の夏休みは8月1日から8月31日までの31日間あります。）

その映画館では、夏休みの間にn つの映画が上映されることになっています。
それぞれの映画には 1 から n までの番号が割り当てられており、i 番目の映画は8月 ai 日から8月 bi 日の間だけ上映されます。

太郎君は映画を見た時、それが初めて見る映画だった場合は 100 の幸福度を得ることができます。
しかし、過去に 1 度でも見たことのある映画だった場合は 50 の幸福度を得ます。

太郎君は上映される映画の予定表をもとに、夏休みの計画を立てることにしました。
太郎君が得られる幸福度の合計値が最大になるように映画を見たときの合計値を求めてください。

どの日も必ず1つ以上の映画が上映されていることが保証されます。

Input

入力は以下の形式で与えられる。

n
a1 b1
a2 b2
...
an bn

1行目に、1つの整数 n が与えられる。
2行目からの n 行のうち i 行目には 2 つの整数 ai, bi が空白区切りで与えられる。

Constraints

1 ≤ n ≤ 100

1 ≤ ai ≤ bi ≤ 31 (1 ≤ i ≤ n)

Output

太郎君の得られる幸福度の合計値の最大値を出力せよ。

Sample Input 1

4
1 31
2 2
2 3
3 3

Sample Output 1

1700

Sample Input 2

5
1 10
10 20
20 21
22 31
4 20

Sample Output 2

1800

Solution in C# (judge verdict: Wrong Answer)

using System.Linq;
using System;

public class P
{
    public int from { get; set; }
    public int to { get; set; }
}

public class Hello
{
    public static void Main()
    {
        var n = int.Parse(Console.ReadLine().Trim());
        var te = new int[33];
        var mv = new int[33];
        var mv2 = new bool[33];
        var wt = new P[n];
        for (int i = 0; i < n; i++)
        {
            string[] line = Console.ReadLine().Trim().Split(' ');
            var a = int.Parse(line[0]);
            var b = int.Parse(line[1]);
            wt[i] = new P { from = a, to = b };
            te[a]++;
            te[b + 1]--;
        }
        mv[1] = te[1];
        for (int i = 2; i <= 31; i++) mv[i] = mv[i - 1] + te[i];
        var ps = wt.OrderBy(x => x.to - x.from).ToArray();
        var ret = getAns(mv, mv2, ps);
        Console.WriteLine(ret * 100 + (31 - ret) * 50);
    }
    public static int getAns(int[] mv, bool[] mv2, P[] ps)
    {
        var c100 = 0;
        foreach (var x in ps)
        {
            if (x.from == x.to)
                if (mv2[x.from]) continue;
                else { c100++; mv2[x.from] = true; continue; }
            var tmin = mv[x.from]; var tmini = x.from;
            if (tmin == 1 && !mv2[x.from]) { c100++; mv2[x.from] = true; continue; }
            for (int i = x.from + 1; i <= x.to; i++)
            {
                if (mv[i] == 1 && !mv2[i]) { tmini = i; break; }
                else if (mv[i] < tmin && !mv2[i]) { tmini = i; tmin = mv[i]; }
            }
            if (!mv2[tmini])
            {
                c100++;
                mv2[tmini] = true;
            }
        }
        return c100;
    }
}