首页 > 代码库 > 猫和胖老鼠
猫和胖老鼠
FatMouse准备了M磅的Cat-Food,以便用来跟小Cat交换好吃的JavaBean。
现在有N个房间,第i个房间有J[i]磅的JavaBean,其交换的筹码是F[i]磅的Cat-Food。
当然,FatMouse还是有很大的选择权的,对任意一个房间,它可以只交换一部分的Cat-Food。
现要求FatMouse以怎样的策略才能获得最多的Cat-Food。
这也是一道简单 & 典型的贪心算法题,
这道贪心比HDOJ-ACM-1052-Tian Ji — The Horse Racing:田忌赛马要简单许多,
它的整体思路就是以javaBean/catFood比为基准,大比值房间优先。
/*#include <stdio.h>
int main()
{
int M,N;
while(scanf("%d%d",&M,&N)!=EOF)
{
int i,j,J[1000],F[1000],temp1;
double ratio[1000],JavaBeans=0,temp;
if((M==-1)&&(N==-1))
{
return 0;
}
for(int i=0;i<N;i++)
{
scanf("%d%d",&J[i],&F[i]);
ratio[i]=(J[i]*1.0)/F[i];
}
for(i=0;i<N;i++)
{
for(j=0;j<N-i-1;j++)
{
if(ratio[j]<ratio[j+1])
{
temp=ratio[j];
ratio[j]=ratio[j+1];
ratio[j+1]=temp;
temp1=F[j];
F[j]=F[j+1];
F[j+1]=temp1;
temp1=J[j];
J[j]=J[j+1];
J[j+1]=temp1;
}
}
}
for(i=0;i<N;i++)
{
if(M>=F[i])
{
JavaBeans=J[i]+JavaBeans;
M=M-F[i];
}
else
{
JavaBeans=JavaBeans+ratio[i]*M;
break;
}
}
printf("%.3lf\n",JavaBeans);
}
return 0;
}*/
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[10010];
int b[10010];
double c[10010];
int main ()
{
int m,n;
while(scanf("%d%d",&m,&n)==2)
{
if (m==-1&&n==-1) {break;}
for (int i=0; i<n; i++)
scanf("%d%d",&a[i],&b[i]);
for(int i=0; i<n; i++)
{
c[i]=(a[i]*1.0)/b[i];
}double temp;int temp1;int temp2;
for(int i=0; i<n; i++)
{
for(int j=0; j<n-i-1; j++)
{
if(c[j]<c[j+1])
{
temp=c[j];
c[j]=c[j+1];
c[j+1]=temp;
temp1=a[j];
a[j]=a[j+1];
a[j+1]=temp1;
temp2=b[j];
b[j]=b[j+1];
b[j+1]=temp2;
}
}
}
float s=0;
for (int i=0; i<n; i++)
{
if(m>=b[i])
{
s=s+a[i];m=m-b[i];
}
else
{
s=s+(c[i])*m;
break;
}
}
printf("%.3f\n",s);
}
return 0;
}
/*
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1*/
猫和胖老鼠