[HDOJ]1009. FatMouse' Trade

      恩,简单的排序问题,以前的排序问题只是会牵扯一个数组,这次只不过是把两个数组结合起来排序而已。

      为了以最小的F[i]得到最多的J[i],只需要按照F[i]/J[i]的值从大到小对两个数组重新排序下就可以了。然后再按照从大到小的数组去分配M pounds of cat food,直到food分配完或者所有的JavaBeans都被保护为止。AC代码如下:

#include <iostream>
#include 
<iomanip>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen(
"1009.txt","r",stdin);
#endif
    
int m,n;
    
int J[1000],F[1000];
    
while(cin>>m>>n)
    
{
        
if(m == -1 && n == -1)
            
break;
        
//输入相应的J和F数组
        for(int i = 0;i < n;++i)
            cin
>>J[i]>>F[i];
        
//按照F[i]/J[i]比例大小对两个数组进行排序
        int t,temp;
        
double sum = 0.0;
        
for(int i = 0;i < n-1;++i)
        
{
            t 
= i;
            
for(int j = i+1;j< n;++j)
                
if((J[j]*1.0/F[j]) > (J[t]*1.0/F[t]))
                    t 
= j;
            temp 
= F[i];F[i] = F[t];F[t] = temp;
            temp 
= J[i];J[i] = J[t];J[t] = temp;
        }

        
int i = 0;
        
//分配老鼠手中所仅有的m pounds of cat food,直到food分配完毕或者所有的JavaBeans都得到了保护
        while((m - F[i]) >=0 && i < n)
        
{
            sum 
+= J[i];
            m 
= m - F[i];
            
++i;
        }

        
if(i < n)
            sum 
= sum + (m*1.0)/F[i]*J[i];
        cout
<<fixed<<setprecision(3)<<sum<<endl;
    }

    
return 0;
}

 

posted on 2009-04-17 20:39  笔记  阅读(746)  评论(0编辑  收藏  举报

导航