链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=967
描述:要做n双鞋子,第 i 双鞋子要做Ti天,每天消耗Si的钱(当前正在做第 i 双鞋子时不耗钱)。求在最少消耗钱的情况下做鞋子的顺序。
思路:贪心
明显是一个排序的模型,然后我们就思考顺序怎么确定。考虑当前两双鞋子a和b,它们的顺序对它们前后的鞋子都没有影响,它们所创造的影响仅仅是a和b本身的消耗。顺序是ab时,消耗为Ta*Sb;顺序是ba时,消耗为Tb*Sa。只需要比较Ta*Sb和Tb*Sa的大小排序就可以了。
我的实现:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 #define MaxN 1020 7 struct node 8 { 9 int Time,Fine,Num; 10 }Shoe[MaxN]; 11 int T,n; 12 inline void Get_int(int &Ret) 13 { 14 char ch; 15 bool flag=false; 16 for(;ch=getchar(),ch<‘0‘||ch>‘9‘;) 17 if(ch==‘-‘) 18 flag=true; 19 for(Ret=ch-‘0‘;ch=getchar(),ch>=‘0‘&&ch<=‘9‘;Ret=Ret*10+ch-‘0‘); 20 flag&&(Ret=-Ret); 21 } 22 bool Cmp(node a,node b) 23 { 24 return a.Fine*b.Time > a.Time*b.Fine; 25 } 26 int main() 27 { 28 Get_int(T); 29 int i; 30 while(T--) 31 { 32 Get_int(n); 33 for(i=1;i<=n;++i) 34 { 35 Get_int(Shoe[i].Time); 36 Get_int(Shoe[i].Fine); 37 Shoe[i].Num=i; 38 } 39 sort(Shoe+1,Shoe+1+n,Cmp); 40 for(i=1;i<n;++i) 41 printf("%d ",Shoe[i].Num); 42 printf("%d\n",Shoe[n].Num); 43 if(T) 44 printf("\n"); 45 } 46 return 0; 47 }
状态:
[题解]UVA10026 Shoemaker's Problem,布布扣,bubuko.com
[题解]UVA10026 Shoemaker's Problem
时间: 2024-10-23 10:26:38