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