POJ4151 电影节

总时间限制:
1000ms
内存限制:
65536kB

描述:
大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。
输入:
多组数据。每组数据开头是n(n<=100),表示共n场电影。
接下来n行,每行两个整数(0到1000之间),表示一场电影的放映区间
n=0则数据结束
输出:
对每组数据输出最多能看几部电影
样例输入:
8
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
0
样例输出:
3
来源:
Guo Wei

题意分析:

由题目可知,要尽量看更多的电影,那么策略就是通过对电影时间进行某一种排序后,再进行贪心策略

下面给出两种方法:

方法一:

对电影结束时间进行从早到晚的排序,然后尽量选取结束早的电影看,以节省时间看后面的更多的电影。具体的操作方法是:对按结束时间排序后的电影从早到晚一个个遍历,若当前遍历到的这部电影的结束时间早于下一部电影的开始时间,则sum++(sum初始化为1,因为显然最少可以看一部电影),若当前遍历到的这部电影的结束时间完于下一部电影的开始时间,则看当前这部,不看下一部电影了(原因:对于重合的两场电影,当然选择结束早的,为后面留下更多的时间,这就是一种贪心思想)。

AC代码:

// An highlighted block
#include<bits/stdc++.h>
using namespace std;struct node
{int begin,end;//记录开始时间和结束时间
}a[105];int cmp(node a,node b)
{return a.end<b.end;//按结束时间由小到大排序
}int main()
{int t;while((cin>>t)&&(t!=0))//数据组数{for(int i=0;i<t;i++){scanf("%d%d",&a[i].begin,&a[i].end);//依次输入数据}sort(a,a+t,cmp);//排序int sum=1;//最少看的电影书肯定是1int js;//表示结束时间js=a[0].end;for(int i=1;i<t;i++)//依次遍历{if(a[i].begin>=js)//如果下一场开始的时间在这一场结束时间之后,就满足要求{js=a[i].end;//更新结束时间的值sum++;//可以看电影的个数+1}}printf("%d\n",sum);}
}

方法二:

自己瞎想出来的野路子,没有第一种简洁,但方法还是挺有意思滴而且没有用到c++的知识(纯c实现的)。

大体思路是:利用a[x]=y储存开始时间和结束时间(x是开始时间,y为结束时间)。由于存在同一个开始时间对应着两场结束时间不一样的电影的情况,就要对这种情况下的电影进行取舍,和方法一的贪心策略一样,当然选择结束时间早的(如何选择时间少的呢,不妨让每次输入进来的x,y时,让a[x]与y对比,若a[x]>y,则将y赋值给a[x]以更新a[x])。同时每次输入一个x时,让q[x]++(在这操作前要对q[1005]全部初始化为0,以记录出现过哪些x)。

然后再搞一个rem[1005]数组,以记录x,记录方法为rem[1]=x1(x1为输入的x中第一小的x) rem[2]=x2 …………以此类推下去。

然后就剩代码中这部的理解了:

// An highlighted block
for(int i=1; i<=cnt-1; i++)//cnt是一共有几个不同的 x{if(a[rem[i]]<=rem[i+1])//情况1下面画图来解释{sum++;}else if(a[rem[i]]>=a[rem[i+1]]&&rem[i]<=rem[i+1])//情况2{continue;}else if(a[rem[i]]>=rem[i+1])//情况3{a[rem[i+1]]=a[rem[i]];}}printf("%d\n",sum);

情况一:(上面的线是第i场电影的时间长度线 ,下面的是i+1场的时间长度线)

情况二:

情况三

下面是这个方法的AC完整代码:

// An highlighted block
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
int main()
{int n;while(scanf("%d",&n)!=EOF&&n!=0){int a[1005];int rem[1005]= {0};for(int i=0; i<=1004; i++){a[i]=9999;}int x,y;int sum=1;int q[1005]= {0};for(int i=1; i<=n; i++){scanf("%d%d",&x,&y);if(x==y){sum++;}q[x]++;if(a[x]>y){a[x]=y;}}int cnt=0;for(int i=0; i<=1000; i++){if(q[i]!=0){cnt++;rem[cnt]=i;}}for(int i=1; i<=cnt-1; i++){if(a[rem[i]]<=rem[i+1]){sum++;}else if(a[rem[i]]>=a[rem[i+1]]&&rem[i]<=rem[i+1]){continue;}else if(a[rem[i]]>=rem[i+1]){a[rem[i+1]]=a[rem[i]];}}printf("%d\n",sum);}return 0;
}

POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础相关推荐

  1. 百钱买百鸡python编程列表推导式_使用循环和列表推导式两种方法求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?...

    [程序题]编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n [单选题]患者男,67岁.确诊为原发性支气管肺癌,为行手术 ...

  2. 百练-4151 电影节 贪心

    4151:电影节 查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区 ...

  3. 百练 4151:电影节

    这个题之前也在书上看到过,属于贪心算法部分的题,贪心的部分在于电影的结束时间要越早越好 具体思路:先按照结束时间进行排序,每次选择结束时间最早的电影,之后在剩余的电影中,选择开始时间在这次选择的电影结 ...

  4. 北大百练 4075. 矩阵旋转

    题目概述 解题思路 思路比较简单,只需要修改一下打印数组的顺序即可.原先是从左往右.从上往下读取数组,现在打印数组的顺序变成从下往上.从左往右. 方法性能 示例代码 #include<iostr ...

  5. 百练OJ:2807:两倍

    题目链接:2807:两倍 描述:给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍.比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是 ...

  6. python百题百练 二级题目_计算机二级选择题(公共基础新大纲)

    本文是计算机二级考试公共基础部分. 选择题里面是前10个,即考试考10分. 本文档包含了所有已经考过的选择题公共基础适用2020年新考试大纲,新增加计算机系统80个题目,以下科目均适用. 二级公共基础 ...

  7. C语言每日一练——第72天:打印杨辉三角(使用两种方法)

    C语言每日一练 2022年1月5日 文章目录 题目描述 问题分析 1. 使用数组法(打印直角三角) 2. 使用数组法(打印等腰三角) 3. 使用公式法(打印等腰三角) 网上参考 题目描述 打印杨辉三角 ...

  8. POJ 3461 还是两种方法

    上午我用了Rabin-Karp算法做的.基本的数据可以测试通过,但是一提交就WA.偶滴天啊,我不知道错在哪啊..我是非专业的..呜呜.找了半天找不出.算了.看人家都是用KMP做的,那我下午就用KMP写 ...

  9. poj 1129 也算是遍历的吧 两种方法

    我当时是不懂题目是什么意思的,看了别人的才知道原来是所谓的四色问题.我也不知道是什么东东,查了才懂.要学的还有很多呢!太弱了.关键把结构存储进去后,每次遍历它的邻接节点.并把用的颜色标记下来.然后再每 ...

最新文章

  1. (转载) 数组a[]={3,5,2,4,1,8},要求从a中找出所有“和”等于10的子集
  2. 多协议标签交换(MPLS)技术的潜在弱点—Vecloud
  3. codeforces 拼手速题2
  4. linux如何设置浏览器,如何从 命令行 设置默认浏览器?
  5. java提高篇(四)---LinkedList
  6. 玩转GIT系列之【如何放弃本地/服务器端所做的修改】
  7. SQL15 查看学校名称中含北京的用户(通配符使用)
  8. python爬电影_使用Python多线程爬虫爬取电影天堂资源
  9. Magento教程 8:如何新增首页选单?
  10. UITouch 触摸事件处理(实例)
  11. mysql 如何按时间备份_如何定时备份mysql数据库
  12. python怎么批量处理数据_python如何批量处理excel数据?_后端开发
  13. Python安装GDAL库的问题
  14. 机器学习 - [源码实现决策树小专题]决策树中子数据集的划分(不允许调用sklearn等库的源代码实现)
  15. centos安装python环境_Centos7 安装python3 环境 并使用pip安装docker-compose
  16. Word中如何设置论文中的公式与序号
  17. 软件安全(彭国军)期末复习
  18. 肝通宵写了三万字把SQL数据库的所有命令,函数,运算符讲得明明白白讲解,内容实在丰富,建议收藏+三连好评!
  19. mapbox加载高程图结果谷歌浏览器提示无法初始化WebGl???
  20. 3D游戏编程与设计-井字棋

热门文章

  1. Hi3798日志分析-海思
  2. 基于MSP430单片机的简单门禁系统
  3. 用软碟通制作系统启动盘的诀窍,不掌握永远成不了老司机!
  4. -Djava.security.egd=file:/dev/./urandom参数的作用
  5. VS 2019 初次使用 gitlab
  6. 【安装教程】vscode安装教程(超详细)
  7. SUMIF函数的7种使用方法
  8. 应变固体潮Matlab,应变固体潮理论值计算及其调和分析
  9. 2019数据结构考研(一)
  10. 【9007】最短路径