贪心小结(贪心入门提高15题)

来源:互联网 发布:服装商品数据分析公式 编辑:程序博客网 时间:2024/06/05 05:11


1. HDU 1009    FatMouse' Trade 

水题。对能得到的 javabean与所需要的catfood的比值拍个序,从大到小取即可。


2.ZOJ 1029 Moving Tables 

将问题转化成区间覆盖问题。将某一段被占用的次数用一个数组记录一下,最后被占用次数最多的就是最小时间。注意一下奇偶房间号的处理。




3.POJ 1065 Wooden Sticks

水题。以L为第一关键字,W为第二关键字排序,每次启动都从L,W最小的开始,尽可能多的处理Stick。


4.POJ 1323 Game Prediction

从大到小排个序。每次都打出自己手中最大的牌,判断其他人手中有没有大过自己的这张牌,如果有就用其他人手中最小的牌大于这张牌的牌打,如果没有就胜出一次。


5.POJ 1018 Communication System(推荐)

枚举B,即固定B,选择满足Bi>=B且Pi最小的P,求得最大的B/P即可。


6.POJ 1922 Ride to School(智商题= =)

这题可以这样理解:一个人坐在别人的车上从起点出发,如果中途遇到比他所在车的车速快,他就跳上另一辆车速更快的车。。。这个过程将一直持续到他到达终点。

这题首先要明确他一定是在某一辆车上到达的终点。所以他到达终点的时间应该和这辆车从出发到到达终点到达时间

。(即在路上行驶的时间+出发时间)。


7. HDU 1789 Doing Homework again

减分多的肯定是要先做啦,但做作业的时间安排一定要科学,这样才能尽量多做减分的作业。按减分大小从大到小排序。每个作业在不超过deadline的情况下尽可能的拖延,最好就放在deadline那天做。如果deadline被其他减分更的作业占了,就往deadline前找最迟可以安排的时间。如果在deadline之前的时间都被占用了,这个作业只能放弃,坐等减分了。。。


8.HDU 2037 今年暑假不AC

以结束时间为第一关键字,开始时间为第二关键字排序。每次都先看结束时间最早的节目,以留出尽可能多的时间给其他节目。


9.POJ 1456 Supermarket

同题7。(HDU 1789 Doing Homework again)


10. POJ 1328 Radar Installation(推荐,经典)

转化成区间覆盖问题。求出对于每个小岛的雷达安装位置的区间,即一个雷达可以安装在OX坐标轴上的区间范围。区间重叠的小岛可以用一个雷达搞定,计算有多少个这样的重叠区间即可。


11.POJ 2437 Muddy roads

按起始位置从小到大排个序,每次都从起始位置尽量往右铺。没什么可说的了,模拟现实做法即可。


12.POJ 1042 Gone Fishing(推荐)

从后向前枚举终止地点,从总时间中减去所有从一个池塘到另一个池塘的时间,剩下的就都是用在钓鱼的时间。每次都选能钓鱼最多的池塘,中间进行鱼数变化的维护。


13.POJ 3637 Shopaholic

水题。排序,取MOD3==0的数。


14. POJ 1744 Elevator Stopping Plan (推荐)

楼天成男人八题之一。题意一开始理解的有点歪,一直WA,在网上搜题意,顺便把题解也看了= =b 好题浪费了啊。

二分+贪心。具体见:http://blog.csdn.net/hrhacmer/article/details/9301295


15.UVA 10382 Watering Grass

转化成区间覆盖。求出每个洒水装置的洒水范围(就是一个矩形),用大范围覆盖小范围,被大范围覆盖的就可忽视。(半径小于W/2也要忽视)。

贴下这题代码吧。

Code:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#define eps 1e-6using namespace std;const int maxn=10010;struct node {    double l,r;}spr[maxn];bool cmp(node a,node b){    return a.l<b.l;}int main(){    int n,cnt;    double l,w,pos,rad;    while(scanf("%d %lf %lf",&n,&l,&w)==3){        cnt=0;        for(int i=0;i<n;i++){            scanf("%lf %lf",&pos,&rad);            if(rad<=(w/2.0)) continue;            double d=sqrt((rad*rad)-(w*w)/4.0);            spr[cnt].l=pos-d;            spr[cnt++].r=pos+d;        }        sort(spr,spr+cnt,cmp);        int ans=0,pre=0,i;        double maxp=0.0,curp=0;        while(maxp<l){            maxp=-1.0;            for(i=pre;i<cnt;i++){                if((spr[i].l>curp)&&(fabs(spr[i].l-curp)>eps)) break;                if(spr[i].r>maxp) maxp=spr[i].r;            }            if(maxp<0){                ans=-1;                break;            }            pre=i;            curp=maxp;            ans++;        }        printf("%d\n",ans);    }    return 0;}















原创粉丝点击