C#, 114 99 * 0.5 = 49.5 bytes
(With a little help from VisualMelon's answer) Edit: and James Webster's comment
int[]A(int n){int m=n,i,c=0;var a=new int[n*(n+1)/2];while(m-->0)for(i=m;i++<n;)a[c++]=i;return a;}
Ungolfed:
int[] FooBar(int n)
{
int altCounter = n, i, arrayCounter = 0;
var returnArray = new int[n * (n + 1) / 2];
while(m-->0)
for(i = altCounter; i++ < n; )
returnArray[arrayCounter++]=i;
return returnArray;
}
There is an unsafe version that I shamelessly took from feersum's C answer, but I'm not 100% sure it fits within the rules since you have to allocate the memory before calling the method.
C# (unsafe), 82 * 0.5 = 41 bytes
unsafe void A(int n,int*p){int*z=p;int m=n,i;while(m-->0)for(i=m;i++<n;)z++[0]=i;}
Called as follows:
int n = 5, length = (int)((n / 2f) * (n + 1));
int* stuff = stackalloc int[length];
int[] stuffArray = new int[length];
A(n, stuff);
System.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuffArray), stuffArray, 0, stuffArray.Length);
//stuffArray == { 5, 4, 5, 3, 4, 5, 2, 3, 4, 5, 1, 2, 3, 4, 5 }
Per VisualMelon's suggestion (thanks!), the unsafe code can be re-made with safe code which reduces the size even further! Still poses the question if the creation of the final result array is allowed to be done outside of the method.
C#, 72 * 0.5 = 36 bytes
void A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}
/⍨⍳n