当前位置: 首页 > news >正文

贪心:Stall Reservations S

题目:P2859 [USACO06FEB] Stall Reservations S - 洛谷

题目概述:每头奶牛都有自己的产奶时段(包括边界点),产奶时要单独呆在牛棚里。问至少需要多少牛棚?奶牛产奶时呆在哪个牛棚里?

思路:

怎么找?  

        找最早结束牛棚的那一个。如果奶牛的产奶时间,小于等于,最早结束牛棚产奶的那一头奶。说明需要新牛棚。

如果有多个牛棚怎么办?

        都可以用,但我们这里用最早结束的牛棚。

有点点复杂~配代码分析:

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

const int N = 5e4 + 10;

int n;

struct node
{
    int x;                                         // 起始时间/结束时间 
    int y;                                         // 终止时间/牛棚标号 
    int z;                                         // 排序之前的编号 
    
    //比较器的工作 
    //如果返回 true,表示第一个参数比第二个参数“优先级低”,应该排在后面。
    //如果返回 false,表示第一个参数比第二个参数“优先级高”,应该排在前面。
    //std::priority_queue默认使用 std::less<T>作为比较器,而 std::less<T>内部调用的是 operator<
    bool operator<(const node& a) const
    {
        return x > a.x; //使优先队列按x从小到大排序(小顶堆)
    }

}a[N];

int ret[N];

bool cmp(node&x , node& y)
{
    return x.x < y.x;   //按起始时间从小到大排序 
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i].x >> a[i].y;
        a[i].z = i;         //记录原始编号 
    } 
     sort(a+1, a+1+n, cmp); //按起始时间排序 

     int num = 1; //牛棚技术器 
     priority_queue<node> heap; //优先队列,存储(结束时间,牛棚编号)
     //默认参数:等价于priority_queue<node, vector<node>, less<node>> heap; 

     //初始化 
     ret[a[1].z] = 1;           //第一头奶牛分配牛棚1 
     heap.push({a[1].y, 1});    //将结束时间和牛棚编号加入队列 
      //       {a[1].y, 1} 是一个初始化列表,用于构造一个 node对象
//      等价于
//        node temp;
//        temp.x = a[1].y; 
//        temp.y = 1;      
//        heap.push(temp); 

     for (int i = 2; i <= n; i++)
     {
         int l = a[i].x, r = a[i].y;  //当前奶牛的起始时间和结束时间 
         if (l <= heap.top().x) // 如果当前起始时间小于等于 最早结束的牛棚的结束时间
         {
             num++;             //需要新牛棚 
             ret[a[i].z] = num; //分配新编号 
             heap.push({r, num}); //新牛棚入队 
         }
         else
         {
             node t = heap.top(); heap.pop(); //获取最早结束的牛棚 
             ret[a[i].z] = t.y;               //分配该牛棚编号 
             heap.push({r, t.y});             //更新结束时间后重新入队 
         }
     }

     
     cout << num << endl;
     for (int i = 1; i <= n; i++) cout << ret[i] << endl;
    
    return 0;
 } 

总代码:

#include <iostream>
#include <queue>
#include <algorithm>using namespace std;const int N = 5e4 + 10;int n;
struct node
{int x; // 起始时间/结束时间 int y; // 终止时间/牛棚标号 int z; // 排序之前的编号 bool operator<(const node& a) const{return x > a.x; //使优先队列按x从小到大排序(小顶堆)}
}a[N];
int ret[N];bool cmp(node&x , node& y)
{return x.x < y.x;   //按起始时间从小到大排序 
}int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i].x >> a[i].y;a[i].z = i; 		//记录原始编号 } sort(a+1, a+1+n, cmp); //按起始时间排序 int num = 1; //牛棚技术器 priority_queue<node> heap; //优先队列,存储(结束时间,牛棚编号)//初始化 ret[a[1].z] = 1;           //第一头奶牛分配牛棚1 heap.push({a[1].y, 1});    //将结束时间和牛棚编号加入队列 for (int i = 2; i <= n; i++){int l = a[i].x, r = a[i].y;  //当前奶牛的起始时间和结束时间 if (l <= heap.top().x) // 如果当前起始时间小于等于最早结束的牛棚的结束时间{num++;             //需要新牛棚 ret[a[i].z] = num; //分配新编号 heap.push({r, num}); //新牛棚入队 }else{node t = heap.top(); heap.pop(); //获取最早结束的牛棚 ret[a[i].z] = t.y;               //分配该牛棚编号 heap.push({r, t.y});             //更新结束时间后重新入队 }}cout << num << endl;for (int i = 1; i <= n; i++) cout << ret[i] << endl;return 0;} 

时间复杂度分析:

  1. ​输入读取​​:循环读取 n 头奶牛的数据,时间复杂度为 O(n)。

  2. ​排序​​:使用 sort函数对奶牛按起始时间从小到大排序,时间复杂度为 O(n log n)。

  3. ​优先队列操作​​:

    • 初始化:将第一头奶牛的信息加入优先队列,操作时间为 O(1)。

    • 循环处理剩余 n-1 头奶牛:每次循环中,访问堆顶元素(O(1)时间),并可能执行堆的弹出(pop)和插入(push)操作。堆操作(pop push)的时间复杂度为 O(log k),其中 k 是堆的大小(最大为 n)。因此,处理所有奶牛的总时间复杂度为 O(n log n)。

总时间复杂度:

  • 主导项是排序和优先队列操作,两者都是 O(n log n),因此总时间复杂度为 O(n log n)。

http://www.dtcms.com/a/458067.html

相关文章:

  • 商务网站怎么做wordpress模板 更换
  • 企业建设网站的目的wordpress路由与模板调用
  • 滕州住房和城乡建设局网站企业网站设计建设
  • C4D域功能深度解析:随机域、着色器域、声音域、公式域与Python域详解
  • SQL 面试题解析:如何用多表查询写用户订单统计?
  • 建设网站需要收费吗wordpress前台注册登录弹窗代码
  • 双通道记忆网络架构在实际部署时平衡计算资源
  • 网站与域名的区别提供中山精品网站建设
  • 从定性到量化:为何指标是非功能性需求的灵魂与尺度
  • UV环境+UV环境中CUDA安装
  • 一家专门做动漫的网站钓鱼网站源码
  • 网站打开慢 可以只换空间不换域名吗在国外建设网站
  • Oracle 11gR2 RMAN备份
  • C++---》stl : pair 从使用到模拟实现
  • 自己做的网站很卡百度seo规则最新
  • 网站建设管理教程视频厦门网站建设哪家比较好
  • Java-Spring入门指南(二十一)Thymeleaf 视图解析器
  • wordpress phpdisk上海做网站seo
  • 徐州网站简介校园网站建设需要什么
  • mysql基础【SQL语句】
  • 二手车网站程序霍山网站建设
  • 【深度学习新浪潮】有没有专门的风格迁移库可以在Python中使用?
  • php做的网站用什么后台基层政权和社区建设司网站
  • 在VMWare上安装openEuler 25.09
  • 网站即将上线页面代码如何开科技软件
  • 我要自学网网站建设与管理上海工商管理局官网
  • 流量套餐网站网站建设方案书例子
  • 在您的网站首页添加标签中企动力 网站建设
  • 百度站长网站地图南昌天和建设有限公司网站
  • MySQL主从复制:数据同步实战指南