zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    第七周-学习进度条
    《梦断代码》阅读笔记01
    第六周-学习进度条
    构建之法阅读笔记03
    结对项目开发(石家庄地铁乘车系统)
    第五周-学习进度条
    第四周-学习进度条
    HDU--1272 小希的迷宫(并查集判环与联通)
    HDU--1856 More is better(简单带权并查集)
    HDU--3635 带权并查集
  • 原文地址:https://www.cnblogs.com/vongang/p/2146098.html
Copyright © 2011-2022 走看看