P2207 Photo

题目描述

Framer Jhon 打算给他的N头奶牛照相,( 2 <= N <= 1 000 000 000) 。

他们排成一条线,并且依次取1~N作为编号。

每一张照片可以拍摄到这列奶牛中一个连续的区间中的奶牛。

对于每一头奶牛,FJ都想要让Ta至少出现在一张照片里。

不幸的是,有K对关系不好的奶牛( 1 <= K <= 1000),他们拒绝出现在同一张照片里。

已知所有关系不好的奶牛所在的位置,请计算出FJ需要的最小需要拍摄的照片数量。

输入输出格式

输入格式:

*第一行: 两个整数: N,K.

*第2..K+1行中,第i+1行有两个整数,记为A_i与B_i。它们代表着处在队列中第A_i头奶牛与第B_i头奶牛是关系不好的,它们不能出现在同一张照片里。

输出格式:

*一个整数,代表FJ需要的最小需要拍摄的照片数量

输入输出样例

输入样例#1:

7 3
1 3
2 4
5 6
输出样例#1:

3

说明

输出解释:FJ可以只拍三张照片:[1,2] , [3,5] , [6,7]

网上找不到题解的任何行踪。。

A了这道题之后看了看洛谷上其他提交的代码    都没有我的好



我的代码也不一定完全对,有一些贪心的成分在里面

大概说一下:

每一对无法共存的关系储存在结构体num里,较小的为a,较大的为b。这个问题就转换成了求最少区间不包含任何一个完整的num区间。

我们按照较小的a对num进行排序。

我们逐个扫描每个num,记录当前所在分组的区间[l,r],初始为[1,num[i].b]

这些num区间有三种情况:相交,相离,内含。因此我们需要对这三种情况进行处理。

那么我们很容易发现,只需要保证区间[l,r]只有同一个num中的a而没有b,

所以,根据上述原则,我们:



当前区间为[l,r],扫描到了第i个num

对于相离:此时应该另起炉灶重新划分区间。

因为num[i].a无论如何也加不进我们的当前区间了。我们新区间就是num[i]的[a,b-1],num[1..i].a都已经包含在上一个区间了,还会剩下一些num[1..i].b放在新区间,或者新区间与旧区间的间隔处(间隔处可以随意归给任意区间,不影响划分),而这些b由于a始终不可能被纳入新区间不要理会。但是,当我们扫描到最后一个区间时,需要给这些b单独划分一个区间,需要对最终分组数+ 1。也存在最有一个区间包含所有b的情况,不需要分组数+1,因此需要特判最后的b是不是最大的b(我写题解的时候才想到,我没有写进去,数据太水辣)。分组数ans加一。

对于相交或者内含:把r设置为min(b - 1, b)即可。因为r如果b不是已经扫描过的num中最小的,就一定有一个最小的包含在区间里,不符合设定。

这样,最终答案为ans + 2,因为最开始一个区间没有记录,最后面的b可能没有被包含进来(正如前面所说需要特判,但是数据太水,我没特判)

根据上述分析,我们发现:l根本用不到!!!只需要考虑r即可

上代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> long long n;
int k;
struct T
{
int a,b;
}num[1000 + 10];
bool cmp(T q, T w){ return q.a < w.a;}
int ans; int main()
{
freopen("data.txt", "r", stdin);
scanf("%d%d", &n, &k);
for(int i = 1;i <= k;i ++)
{
int temp,tempp;
scanf("%d%d", &temp, &tempp);
num[i].a = std::min(temp,tempp);
num[i].b = std::max(temp,tempp);
}
std::sort(num + 1,num + 1 + k, cmp);
int r = num[1].b - 1;
for(int i = 1; i <= k; i ++)
{ if(num[i].a > r)
{
ans ++;
r = num[i].b - 1;
}
r = std::min(r, num[i].b - 1);
}
printf("%d", ans + 2);
return 0;
}

洛谷 USACO P2207 Photo的更多相关文章

  1. USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)

    usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...

  2. 洛谷P2751[USACO]工序安排

    题目传送门 怎么说呢,这个题目我刚开始随便乱搞了几下,交了个暴力代码上去居然还水了49分,数据确实有点弱啊,然后看到洛谷上那位大佬Redbag的题解瞬间就佩服的五体投地,那真的是简洁.易懂又高效.直接 ...

  3. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  4. 洛谷P1519 穿越栅栏 Overfencing

    P1519 穿越栅栏 Overfencing 69通过 275提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 USACO是100分,洛谷是20分 为什么 ...

  5. 洛谷P1214 [USACO1.4]等差数列 Arithmetic Progressions

    P1214 [USACO1.4]等差数列 Arithmetic Progressions• o 156通过o 463提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题 ...

  6. 洛谷 P1219 八皇后【经典DFS,温习搜索】

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

  7. 洛谷P1219 :八皇后(DFS+回溯)

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  8. 洛谷P1219 八皇后【dfs】

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  9. 洛谷 1938 [USACO09NOV]找工就业Job Hunt

    洛谷 1938  [USACO09NOV]找工就业Job Hunt 题目描述 Bessie is running out of money and is searching for jobs. Far ...

随机推荐

  1. UTF小记(一)

    前言 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制.一般用数字0到9和字母A到F(或a~f)表示,其中:A~F表示10~15,这些称作十六进制数字. 不同电脑系统.编程语言对于1 ...

  2. python3-常用模块之time

    import time time模块主要是处理各种类型的时间 常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行,单位为秒. 2.time.time() 获取当前时间戳 时间戳 ...

  3. Android 开发 Camera2开发_3_处理预览和拍照偏暗问题

    通过调整曝光解决 参考:https://stackoverflow.com/questions/28429071/camera-preview-is-too-dark-in-low-light-and ...

  4. SQLServer 2008 的数据库日志清理

    -- SQLServer 2008 的数据库日志清理 ,与 Sql2000 或 2005 的方法不一样,需要采用 下面的sql来清理 USE [master] GO ALTER DATABASE [数 ...

  5. 模板:有旋treap

    有旋转的treap,其实rotate比较难理解 没关系,上板子: 题目还是普通平衡树 #include<iostream> #include<cstdio> #include& ...

  6. ubuntu触摸板失效问题

    很早便遇到这个问题,今天忍无可忍才度娘了一发.亲测有效! 用Ubuntu Tweak备份过桌面的配置,因此我尝试恢复桌面设置,果然奇迹发生了,触摸板立刻恢复了正常使用! 没有备份过的相信使用其中的重置 ...

  7. 转:步步LINUX C--进程间通信(二)信号

    源地址:http://blog.csdn.net/jmy5945hh/article/details/7529651 linux间进程通信的方法在前一篇文章中已有详细介绍.http://blog.cs ...

  8. Object源码阅读

    native修饰符:所修饰的方法的实现是由非java代码实现的 /** * 一个java程序如果想调用本地方法,需要执行两个步骤 * 1.通过system.loadLibrary()将包含本地方法实现 ...

  9. jquery ajax跨越

    JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问 1.jsonp之$.ajax js $.ajax({ ...

  10. 前端js错误日志收集

    今天一个客户说他们的一个同事用OPPO R11的手机访问不了我们的项目,打开后一片空白,虽然后面发现你的手机网络断了,但是想起来毕竟手机端没有调试的工具可以查看抛出的错误信息,方便我们追踪问题,后端的 ...