• 装置输出喷泉装置(贪心问题)


    改章节是一篇关于装置输出的帖子

        

    喷水装置(一)

        

    间时制限: 3000 ms  |  内存制限: 65535 KB

        

    难度: 3
    述描
    现有一块草坪,长为20米,宽为2米,要在横中央线上放置半径为Ri的喷水装置,个每喷水装置的效果都市让以它为中央的半径为实数Ri(0<Ri<15)的圆被湿润,这有足充的喷水装置i(1<i<600)个,并且必定能把草坪全体湿润,你要做的是:选择尽量少的喷水装置,把全部草坪的全体湿润。
    入输
    第一行m表现有m组测试数据
    每一组测试数据的第一行有一个整数数n,n表现共有n个喷水装置,随后的一行,有n个实数ri,ri表现该喷水装置能覆盖的圆的半径。
    输出
    输出所用装置的个数
    样例入输
    2
    5
    2 3.2 4 4.5 6 
    10
    1 2 3 1 2 1.2 3 1.1 1 2
    样例输出
    2
    5

        

    喷水装置(二)

        

    间时制限: 3000 ms  |  内存制限: 65535 KB

        

    难度: 4
    述描
    有一块草坪,横向长w,向纵长为h,在它的橫向中央线上不同置位处装有n(n<=10000)个点状的喷水装置,个每喷水装置i喷水的效果是让以它为中央半径为Ri的圆都被湿润。请在给出的喷水装置中选择尽量少的喷水装置,把全部草坪全体湿润。
    入输
    第一行入输一个正整数N表现共有n次测试数据。
    每一组测试数据的第一行有三个整数n,w,h,n表现共有n个喷水装置,w表现草坪的横向长度,h表现草坪的向纵长度。
    随后的n行,都有两个整数xi和ri,xi表现第i个喷水装置的的横坐标(最边左为0),ri表现该喷水装置能覆盖的圆的半径。
    输出
    每组测试数据输出一个正整数,表现共须要多少个喷水装置,个每输出单占独一行。
    如果不存在一种够能把全部草坪湿润的计划,请输出0。
    样例入输
    2
    2 8 6
    1 1
    4 5
    2 10 6
    4 5
    6 5
    样例输出
    1
    2
        每日一道理
    当浮华给予我们过多欺骗,现实中的虚假几乎让我们忘却了真的存在,是真情唤回了迷离的心,是真情带给了我们最纯、最真的感觉,它流露的是美的誓言,渗透的是永恒执著的真爱。

    程序如下:

        #include<iostream>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    struct SS
    {
        int l;//间区边左
        int r;//间区边右
    }rad[10002];
    bool cmp(SS s1,SS s2)//排序条件???
    {
        if(s1.l<s2.l) return true;
        if(s1.l==s2.l&&s1.r<s2.r)
           return true;
        return false;
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            int n2,w,h;
            cin>>n2>>w>>h;
            for(int j=0;j<n2;j++)
            {
                int left,radius;
                double s=(double)(radius*radius-(h/2)*(h/2));
                if(s<0)//半径不足以覆盖池子的高
                 continue;
                else
                {
                    rad[i].l=left-sqrt(s);
                    rad[i].r=left+sqrt(s);
                }      
            }
            sort(rad,rad+n2,cmp);
            double sum=0;
            double max;
            int flg=1;
            int number=0;

          //心贪算法
            while(sum<w)
            {
                max=0;
                for(int j=0;j<n2&&rad[j].l<=sum;j++)
                {
                    if(rad[j].r-sum>max) max=rad[j].r-sum;
                }
                if(max==0)  
                {
                    flg=0;
                    break;
                }
                else
                {
                    sum+=max;
                    number++;
                }
            }
            if(flg)
              cout<<number<<endl;
            else
              cout<<"0"<<endl;
            return 0;
        }
    }

    注意: 实际上是变相的少最的间区覆盖问题。注意排序的规矩

        


    文章结束给大家分享下程序员的一些笑话语录: 问路
    有一个驾驶热气球的人发现他迷路了。他降低了飞行的高度,并认出了地面 上的一个人。他继续下降高度并对着那个人大叫,“打扰一下,你能告诉我我 在哪吗?”
    下面那个人说:“是的。你在热气球里啊,盘旋在 30 英尺的空中”。
    热气球上的人说:“你一定是在 IT 部门做技术工作”。
    “没错”,地面上的人说到,“你是怎么知道的?”
    “呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。
    地面上的人说,“你一定是管理层的人”。
    “没错”,热气球上的人说,“可是你是怎么知道的?”
    “呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。

  • 相关阅读:
    汇编实现点亮Led灯(2440)
    BootLoader(2440)核心初始化代码
    学习单片机的正确方法(转载)
    ARM-汇编指令集(总结)
    BootLoader的架构设计
    统计单词数(WordCount)
    OPcache
    phpcon china 2017听讲总结
    php-fpm进程内存泄漏
    mysql字符串的隐式转换导致查询异常
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3069869.html
Copyright © 2020-2023  润新知