从两道简单HDU题来了解贪心思想

本文通过两个实际问题介绍了如何运用贪心算法解决日常问题。首先,通过安排观看最多电视节目的例子展示了如何通过排序和比较来实现贪心策略;其次,通过计算发放工资所需人民币数量的问题,介绍了如何选取最优面值组合的方法。

    呵呵,貌似学校OJ上的水题已经刷的差不多了。

    从两道简单的贪心题开始,觉得自己要开始学习些新算法姿势了。

    那这一篇blog就说说简单的贪心吧。

第一题

世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)

Input

输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。

Output

对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。

#include<stdio.h>
struct Time
{
int Ti_s; <span style="font-size: 14.3px; line-height: 20.02px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">//节目开始时间</span>
int Ti_e; //节目结束时间
};
int main()
{
	int a,i,j,count;
    Time time[100],temp;
 while(scanf("%d",&a)!=EOF&&a!=0)
 {
  for(i=0;i<a;i++)
  scanf("%d%d",&time[i].Ti_s,&time[i].Ti_e);

 for(i=0;i<a;i++)
 for(j=i+1;j<a;j++)
 {
     if(time[i].Ti_e > time[j].Ti_e || (time[i].Ti_e == time[j].Ti_e && time[i].Ti_s > time[j].Ti_s ) )
     {
         temp = time[i];
         time[i] = time[j];   //将节目结束时间排序
         time[j] = temp;
     }
 }

 for(i=1,j=0,count=1;i<a;i++)
 {
  if(time[i].Ti_s>=time[j].Ti_e)
   {
      count++;    
      j=i;        //如果后一个的开始的开始时间小于前一个的结束时间就可以完整看后一个视频节目
   }
 }
 printf("%d\n",count);
 }
 return 0;
}



第二题

财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。

Input

输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。
n=0表示输入的结束,不做处理。

Output

对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。

这个题我刚开始想到了用暴力法,结果写得又臭又长。。。。。。

之后想到了前一道题用到的贪心思想,开开心心就把它给A了。

#include<stdio.h>
main()
{
 int n,s,i,m,q,p,t,r,y,j;
 int a[101];
 while(scanf("%d",&j);)
 {
     if(j==0) break;
     s=0;                     //遇零结束
  for(i=1;i<=j;i++)
  {
     scanf("%d",&a[i]);
    m=a[i]/100;               //从面值最大的100元开始选,选到最后便是最优解
    a[i]=a[i] % 100;
    n=a[i]/50;
    a[i]=a[i] % 50;
    q=a[i]/10;
    a[i]=a[i] % 10;
    p=a[i]/5;
    a[i]=a[i] % 5;
    t=a[i]/2;
    a[i]=a[i] % 2;
    r=a[i];
    y=m+n+q+p+t+r;    
     s=s+y;
  }
  printf("%d\n",s);
 }   
 return 0;     
}

贪心算法(又称贪婪算法)是指,在对 问题求解 时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部 最优解 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 (百度)

选择恰当的贪心策略就可以避免复杂的暴力算法,短时间找出最优解。

但是有些问题,比如背包问题,我想用重量价个的比值排序来解这个问题发现得到了个解,但题始终A不了,原来贪心解这个题得到解是经典错解大哭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值