zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    面试题目——《CC150》链表
    TCP/IP——链路层
    TCP/IP——基本知识
    面试题目——《CC150》数组与字符串
    Java递归算法——三角数字(消除递归)
    Java排序算法——拓扑排序
    Java排序算法——希尔排序
    Python学习笔记——条件和循环
    Python学习笔记——集合类型
    英文写作——冠词的使用(Use 0f Articles)
  • 原文地址:https://www.cnblogs.com/cchun/p/2520114.html
Copyright © 2011-2022 走看看