這題我的想法是:
1. 排序數列
2.把數列最小兩個的A[0]+A[1]相加得到值B 在把B加入 Cost
3.把在數列中的A[0]跟A[1]刪除 , 並將 B加入數列中
4.如果數列的大小等於1就結束,否則回到步驟1
5. 印出Cost值
問題是現在上傳後一直TLE , 難道是排序的地方效率有問題嗎?
我是用STL的sort來做的 , 這樣難道是要我自己寫Insert sort才能解決嗎?
#include <stdio.h> #include <algorithm> using namespace std; unsigned int Number[5001],N,T,Sum,Temp,Total; bool compare(int A ,int B) { if ( A<B ) { return 1; } return 0; } int main() { while (scanf("%d",&N)) { /*Input*/ if (N ==0) { break; } for (T =0 ; T < N ;T++) { scanf("%d",&Number[T]); } /**/ /*Algorithm*/ sort(Number,Number+N,compare); Sum=Number[0]; Temp=0; Total=0; while (N-1 > Temp) { Sum=(Number+Temp)[1]+(Number+Temp)[0]; (Number+Temp)[1]=Sum; sort(Number+Temp,Number+N,compare); Total=Total+Sum; Temp++; } printf("%d\n",Total); /**/ } return 0; } |
我看懂m大開 int number[100001] 的用意了
聰明的辦法 這樣就不用跑排序了省了很多 swap 的時間
STL是C++提供的一個很有彈性的 資料結構 和 演算法 的類別庫