今天做这道题,想想3天前还是汶川三周年。哎,沉重。。。。
OK,题目一开始老是看不懂,
上面说3,3
4 ,4其中的第一个3,跟4是单价来着。想错了,还以为是3块钱能够买3单位重量的大米呢。怪不得老是想不出答案。后来一想,原来是1/3这个才是一块钱能够买到的单位重量。发现自己的理解能力越来越弱了,明明都说是“单价了啊,单价啊”。知道了这个,那还不容易?给你7块钱,最多能买多少呢?直接就排序啊,将一重量大米单价花费最小的排在前面。然后顺序下来买啊买。买到第一个完了,就接着第二个。知道最后钱都用完了就是购买的最多重量。知道了吧。。。好,上代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct price
{
int p;//单价
int w;//这种大米的总重量
}t[1001];//结构体,每种大米
bool cmp(struct price a,struct price b)//结构体排序,将一单价能买到最多的排在前面
{
if(a.p<b.p)
return true;
else
return false;
}
int main(void)
{
double p_w[1002],sum,resum;
int all,n;
int i,cas,count;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&all,&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&t[i].p,&t[i].w);
}
// cout<<endl;
sort(t+1,t+n+1,cmp);
for(i=1;i<=n;i++)
p_w[i]=1.0/t[i].p;//用数组p_w计算出每单价大米能够买到的大米重量
// for()
// cout<<p_w[i]<<" ";
for(i=1,count=1,sum=0,resum=0;i<=all;i++)
{
sum+=p_w[count];
if(sum-resum>t[count].w)//从单价最便宜地开始,知道结束
{
sum-=p_w[count];
count++;
resum=sum;
i--;
}
// cout
}
printf("%.2lf\n",sum);
}
return 0;
}