排队打饭 sdut 2443【最简单的贪心法应用举例】
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2443
一天中午,有N个学生来到食堂买饭,他们需要排成了一个一字队伍并按顺序打饭,现在已经知道了每个人买饭的时间,现在食堂的管理员希望知道他们按照怎样的顺序买饭能够使得所有人等待的时间总和最小(每个人等待的时间 = 排在他前面的人的打饭时间和+自己打饭的时间)。
输入
输入的第一行包含一个整数T(T≤30)表示数据组数,每组数据包括两行,第一行为一个整数N表示人数,第二行为N个整数表示每个人买饭所需要的时间,所有整数均不超过100。
输出
每组数据输出一行,包括一个整数,表示所有人等待时间总和的最小值。
示例输入
2 5 1 2 3 4 5 5 45 10 48 37 9
示例输出
35 334
提示
代码:
1 #include<iostream> 2 #include<stdlib.h> 3 #include<algorithm> 4 using namespace std; 5 int cmp(const int a,const int b) 6 { 7 if(a>b)return 1; 8 else return 0; 9 } 10 int main() 11 { 12 int zong ; 13 cin>>zong; 14 while(zong--) 15 { 16 int sum,f[105]; 17 cin>>sum; 18 int i,j; 19 for(i=0;i<=sum-1;i++) 20 cin>>f[i]; 21 sort(f,f+sum,cmp); 22 int n=0; 23 for(i=0;i<=sum-1;i++) 24 { 25 for(j=i;j<=sum-1;j++) 26 n+=f[j]; 27 } 28 cout<<n<<endl; 29 } 30 return 0; 31 }
用sort函数排序事半功倍。