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;
    }

  • 相关阅读:
    AGC041
    二分图 学习笔记
    区间DP 学习笔记
    3月21日考试 题解(数据结构+区间DP+贪心)
    Tarjan 做题总结
    3月15日考试 题解(数学+背包+线段树)
    差分约束 学习笔记
    Tarjan算法 学习笔记
    拓扑排序 学习笔记
    并查集 学习笔记
  • 原文地址:https://www.cnblogs.com/cchun/p/2520114.html
Copyright © 2011-2022 走看看