zoukankan      html  css  js  c++  java
  • NYOJ 12 喷水装置(二)( 贪心)

    看了别人的解法才明白怎么回事,连接:http://blog.csdn.net/u011809767/article/details/52492552

    摘录他的分析过程:

    题目分析:本题可以看作是区间覆盖问题的一个例子,只要对上述的内容稍微转换以下即可,将每个圆的射击范围映射到区间内。可相应转换为:数轴上有n个区间[ai,bi](这个指的是喷水装置的合理的喷水区间),选择尽量少的区间覆盖一条指定线段[s,t](这个区间指的就是[0,w])。

    贪心策略:

    把各区间按照a从小到大排序,从前向后遍历,然后每次选择从当前起点S开始的最长区间,并以这个区间的右端点为新的起点,继续选择,直到找不到区间覆盖当前起点S或者S已经到达线段末端。

    需要注意的是,如果某一区间边界大于s,t的边界,应把它们变成s或t。因为超出的部分毫无意义,同时还会影响对数据的分析

    还学到了pair,相当于是包含有两个变量的struct,连接:点击打开链接

    #include <iostream>
    #include <vector>
    #include <cmath>
    #include <algorithm>
    
    using namespace std;
    
    double f(double r,double h)
    {
        return sqrt(r*r-h*h);
    }
    
    bool cmp(pair<double,double> a,pair<double,double> b)
    {
        return a.first<b.first;
    }
    
    int main()
    {
        int N;
        cin>>N;
        while(N--)
        {
            int n,w,h;
            cin>>n>>w>>h;
    
            vector<pair<double,double> >vec;
    
            for(int i=0; i<n; i++)
            {
                int x,r;
                cin>>x>>r;
                if(r>h/2.0)
                {
                    double l=f(r,h/2.0);
                    pair<double,double> p;
                    p.first=x-l;
                    p.second=x+l;
    
                    vec.push_back(p);
                }
            }
    
            sort(vec.begin(),vec.end(),cmp);
    
            double right=0.0;
            int cnt=0;
            while(right<w)
            {
                double maxl=0.0;
                for(int i=0; i<(int)vec.size() && vec[i].first<=right; i++)
                {
                    if(vec[i].second-right>maxl)
                        maxl=vec[i].second-right;
                }
                if(maxl!=0)
                {
                    cnt++;
                    right+=maxl;
                }
                else
                    break;
            }
    
            if(right>=w)
                cout<<cnt<<endl;
            else
                cout<<0<<endl;
    
        }
        return 0;
    }
    

  • 相关阅读:
    Vue 移动端向上滑动加载
    关于NPOI 判断Office 是否为空的操作
    定时任务的处理
    Web中线程与IIS线程池自动回收机制
    本地VS调试服务器 IIS 程序
    每天学点node系列-stream
    聊聊前端模块化开发
    位运算解决多标签问题【原创】
    <未来世界的幸存者> 读后感(现实篇和职业篇)【原创】
    Nest.js你学不会系列-初识Nest
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746093.html
Copyright © 2011-2022 走看看