HDU_1051 && POJ_1065 Wooden Sticks(贪心)

 

典型的贪心题目,做过很久了,今天复习贪心,回头看了看,顺便把报告补上。

我的思路是做一个标记变量flag和一个计算的变量k(k = n),flag初始为0,

每次找一个满足(l <= l' && w <= w' && !flag)的序列,并将序列元素的flag标为1,

总序列就会减少一个数所以k--,找完一个序列,结果ans++。

然后回头再找第一个falg = 0的元素,确定新的序列。如此循环。。。

代码:

#include <iostream>
#include
<cstdio>
#include
<cstdlib>
using namespace std;

const int N = 5007;

struct node
{
int l;
int w;
int flag;
}num[N];

int cmp(const void * a, const void * b)
{
node
* c = (node *)a;
node
* d = (node *)b;
if(c->l != d->l) return c->l - d->l;
else return c->w - d->w;
}

int main()
{
int T, n, i, j;
//freopen("data.in", "r", stdin);
scanf("%d", &T);
while(T--)
{
scanf(
"%d", &n);
for(i = 0; i < n; i++)
{
scanf(
"%d%d", &num[i].l, &num[i].w);
num[i].flag
= 0;
}
qsort(num, n,
sizeof(num[0]), cmp);
int k = n, ans = 0;
while(k > 0)
{
for(i = 0; i < n; i++) //确定新序列的开头
if(!num[i].flag)
{
num[i].flag
= 1;
k
--; //总序列减少
break;
}
for(j = i+1; j < n; j++)
{
if(num[i].l <= num[j].l && num[i].w <= num[j].w && !num[j].flag)
{
num[j].flag
= 1;
i
= j;
k
--; //满足条件,加入新序列,总序列减少
}
}
ans
++; //确定完一个序列
}
printf(
"%d\n", ans);
}
return 0;
}
posted @ 2011-08-19 19:34  AC_Von  阅读(155)  评论(0编辑  收藏  举报