HDU2187悼念512汶川大地震遇难同胞——老人是真饿了(贪心算法)

今天做这道题,想想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;
}

原文地址:https://www.cnblogs.com/cchun/p/2520114.html