一:杭电原题摘录
http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=1§ionid=3&problemid=19
二.题目分析
又是一个活动安排问题,结构体数组,sort,排序少不了。先分析一下题目的大意:有一个叫黄药师的人,他盖了一个新房子,体积为V,还有N个家具要放进去。能不能放进去需要参照一下规则:家具1需要房子剩余至少B1的空间,才能放进去。放进去之后房子将减少A1的体积。机器随机给出这些数,然后让聪明的黄药师判断是否可以将家具放入新房子中。
根据贪心算法,每次取最优。那在这个具体的问题里什么是最优。把需要空间大的放在前面 ,并不是B大的意思.还好减去放进去之后消耗的体积.这才是所需空间大(不仅放入之前,还有放入之后)
让一个数学表达式来表达它最优的意义:B-A
举一个简单的例子:比如(7,20),(6,20).房子体积为26,先取(6,20)就可以,反之,不行
三.我的收获
贪心算法在一个具体问题中最优的选取,要分析题意得到数学表达式。
四.AC代码
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct stu
{
int a;
int b;
}s[1005];
bool cmp(stu x,stu y)
{
return x.b-x.a>y.b-y.a;//按b-a由大到小排序,贪心,把需要空间大的放在前面
}
int main(int argc, char** argv)
{
int t,v,n,i;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
scanf("%d %d",&v,&n);
for(i=0;i<n;i++)
scanf("%d %d",&s[i].a,&s[i].b);
sort(s,s+n,cmp);
for(i=0;i<n;i++)
{
if(v>=s[i].b)
v-=s[i].a;
else break;
}
if(i==n)printf("Yes\n");
else printf("No\n");
}
}
return 0;
}