USACO Bronze, Ski Design

Hey all,

I am doing this problem:

http://www.usaco.org/index.php?page=viewproblem2&cpid=376

From my understanding, what I need to do is keep changing the highest and lowest hills (per a given iteration), until the difference between the highest and lowest hill is equal to 17, at which point I stop iterating.

However, I am failing the majority of the tests, which clearly means I have misunderstood this problem. Could someone please hint as to why my approach is not right?

My attempt:

#include <fstream>
#include <string>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;

int main(void)
{
    ifstream fin("skidesign.in");
    ofstream fout("skidesign.out");

    // number of lines of input
    int n;
    fin >> n;

    // if we have a single number, there is no cost
    if (n == 1)
    {
        fout << 0 << "\n";
        return 0;
    }

    vector<int> heights;

    int x;
    for (int i = 0; i < n; i++)
    {
        fin >> x;
        heights.push_back(x);
    }

    int max_diff = 17;
    int cost = 0;
    sort(heights.begin(), heights.end());

    // loop invariant is that the height vector is in ascending order.
    while (heights[n - 1] - heights[0] != max_diff)
    {
        heights[n - 1]--;
        heights[0]++;
        cost++;
        sort(heights.begin(), heights.end());
    };

    fout << 2 * (cost * cost) << endl;
    // cout << cost << endl;
    fin.close();
    fout.close();
}