HDU 2014 - 青年歌手大獎(jiǎng)賽_評(píng)委會(huì)打分(統(tǒng)計(jì))
要實(shí)現(xiàn)的算法是:求整個(gè)數(shù)組的和、在數(shù)組中找最值。
找最值,可以先把第一個(gè)元素賦給max、min變量,做一次遍歷,一一比較,把最大值存入max,最小值存入min。
也可以直接對(duì)數(shù)組進(jìn)行排序,然后從第二個(gè)加到倒數(shù)第二個(gè),這樣就可以了,省去減兩個(gè)最值。 ?
編碼建議
Programing
?
我的代碼采用的是第一種方法。因?yàn)閷?duì)于本題來(lái)說(shuō),它的效率是O(N)。
算法不難,可以直接看代碼
這里稍微討論一下第二種方法。
對(duì)于排序,我們可以直接調(diào)用庫(kù)函數(shù)qsort();
語(yǔ)法:
#include
功能: 對(duì)buf 指向的數(shù)據(jù)(包含num 項(xiàng),每項(xiàng)的大小為size)進(jìn)行快速排序。如果函數(shù)compare 的第一個(gè)參數(shù)小于第二個(gè)參數(shù),返回負(fù)值;如果等于返回零值;如果大于返回正值。函數(shù)對(duì)buf 指向的數(shù)據(jù)按升序排序。
#include#includeint?cmp(const?double?*a,?const?double?*b){return?*a?>?*b???1?:?*a?<?*b???-1?:?0;}int?main(void){int?n,?i;double?x,?y[100];while?(scanf("%d",?&n)?!=?EOF){for?(i?=?0?;?i?<?n?;?i++)scanf("%lf",?y?+?i);qsort(y,?n,?sizeof(double),?cmp);for?(x?=?0,?i?=?1?;?i?<?n?-?1?;?i++)x?+=?y[i];printf("%.2fn",?x?/?(n?-?2));}return?0;}
你可能有疑問(wèn),為什么cmp函數(shù)不直接用return *a - *b;
這也就是我不打算用這種方法的原因了(雖然上面的代碼可以Accpted),這就是這段代碼的不穩(wěn)定因素。
我們來(lái)做個(gè)實(shí)驗(yàn):
#include#includeint?main(void){int?i;double?x;x?=?0.123456;printf("%lfn",?x);for?(i?=?0?;?x?-?floor(x);?i++)x?*=?10;printf("%dn",?i);return?0;}
上面的代碼的作用就是確定X小數(shù)點(diǎn)后有幾位。
我相信所有人都知道它有6位小數(shù)。但它的運(yùn)行結(jié)果卻是17(因編譯器而異)。
你可以自己復(fù)制代碼去驗(yàn)證一下。
我們?cè)谘h(huán)體里插入printf("%lfn", floor(x));看看它的變化是怎樣的。
運(yùn)行結(jié)果:
1.000000
12.000000
123.000000
1234.000000
12345.000000
123455.000000
1234559.000000
12345599.000000
123455999.000000
1234559999.000000
12345599999.000000
123455999999.000000
1234559999999.000000
12345599999999.000000
123455999999999.000000
1234559999999999.000000
12345599999999998.000000
這就是double型數(shù)據(jù)的精度問(wèn)題。這是我們無(wú)法人為地控制的。所以建議盡量避免double的高精度運(yùn)算。 ?
#includeint?main(void) { ????int?n,?i; ????double?min,?max; ????double?x,?y; ???? ????while?(scanf("%d",?&n)?!=?EOF) ????{ ????????scanf("%lf",?&x); ????????min?=?max?=?x; ????????for?(i?=?1?;?i?<?n?;?i++) ????????{ ????????????scanf("%lf",?&y); ????????????x?+=?y; ????????????if?(y?>?max)?max?=?y; ????????????if?(y?<?min)?min?=?y; ????????} ????????printf("%.2lfn",?(x?-?min?-?max)?/?(n?-?2)); ????} ????return?0; }