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

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

    

喷水装置(一)

    

间时制限: 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 部门做技术工作”。
“没错”,地面上的人说到,“你是怎么知道的?”
“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。
地面上的人说,“你一定是管理层的人”。
“没错”,热气球上的人说,“可是你是怎么知道的?”
“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。

posted @ 2013-05-09 20:32  坚固66  阅读(201)  评论(0编辑  收藏  举报