HDU 2078 複習時間 貪心 水

2021-10-03 03:49:36 字數 1633 閱讀 3416

problem description

為了能過個好年,xhd開始複習了,於是每天晚上揹著書往教室跑。xhd複習有個習慣,在複習完一門課後,他總是挑一門更簡單的課進行複習,而他複習這門課的效率為兩門課的難度差的平方,而複習第一門課的效率為100和這門課的難度差的平方。xhd這學期選了n門課,但是一晚上他最多只能複習m門課,請問他一晚上覆習的最高效率值是多少?

input

輸入資料的第一行是乙個資料t,表示有t組資料。

每組資料的第一行是兩個整數n(1 <= n <= 40),m(1 <= m <= n)。

接著有n行,每行有乙個正整數a(1 <= a <= 100),表示這門課的難度值。

output

對於每組輸入資料,輸出乙個整數,表示最高效率值。

sample input

22 2

5225

12 5

8964643

5672

9223

2022

3731

sample output

5625

8836

分析資料範圍很小,他似乎很水。

輸入之後直接排序,希望找到差值的平方最大,我想到雙端掃瞄,兩個指標從頭尾各自做運算,就有了以下**,

#include

using

namespace std;

int a[50]

;int

main()

sort

(a, a + n)

;int ans =

0,pos =

0,now =

100;

for(

int i =

0; i < m;

++i)

else

ans =

max(ans,

(now - a[pos])*

(now - a[pos]))

; now = a[pos];}

printf

("%d\n"

, ans);}

}return0;

}

實際上他給的資料範圍是1~100,那麼實際上第一次效率是最高的,(100 - x)2,這個x是序列中的最小值,所以答案直接就是(100 - a[0])2,再往後運算,每次都是越來越接近,越靠近序列中心兩個數字差的平方越小所以上面那個演算法設計有問題,但他還是給a了。修改過後的**如下,

#include

using

namespace std;

int a[50]

;int

main()

sort

(a, a + n)

;int ans =

(100

- a[0]

)*(100

- a[0]

);printf

("%d\n"

, ans);}

}return0;

}

hdu 2078 複習時間

problem description 為了能過個好年,xhd開始複習了,於是每天晚上揹著書往教室跑。xhd複習有個習慣,在複習完一門課後,他總是挑一門更簡單的課進行複習,而他複習這門課的效率為兩門 課的難度差的平方,而複習第一門課的效率為100和這門課的難度差的平方。xhd這學期選了n 門課,但是...

hdu 2078 複習時間

problem description 為了能過個好年,xhd開始複習了,於是每天晚上揹著書往教室跑。xhd複習有個習慣,在複習完一門課後,他總是挑一門更簡單的課進行複習,而他複習這門課的效率為兩門課的難度差的平方,而複習第一門課的效率為100和這門課的難度差的平方。xhd這學期選了n門課,但是一晚...

HDU 2078 複習功課(記憶化搜尋)

為了能過個好年,xhd開始複習了,於是每天晚上揹著書往教室跑。xhd複習有個習慣,在複習完一門課後,他總是挑一門更簡單的課進行複習,而他複習這門課的效率為兩門課的難度差的平方,而複習第一門課的效率為100和這門課的難度差的平方。xhd這學期選了n門課,但是一晚上他最多只能複習m門課,請問他一晚上覆習...