20170929 校内模拟赛 多米诺骨牌

小 Z 最近买了很多很多的多米诺骨牌,他选出了其中的一些排成了一排,并
且准备从右到左碰倒这些骨牌。 每个骨牌有一个坐标xi(>=1)和一个大小yi(>=1),
倒下时将会碰倒坐标区间位于[xi-yi,xi)内的所有骨牌。当然没有两个骨牌有相同
的坐标,并且小 Z 规定坐标大的更靠右。
但是他发现他买的骨牌太巨了,所以在倒下的时候会将所有碰倒的骨牌破坏
掉,被破坏掉的骨牌就无法使用了,并且不会倒下。得知这个消息的小 Z 十分惊
讶,他想知道如果还按刚才这种方法从右到左碰倒所有没被破坏的骨牌, 将有多
少个骨牌被破坏。这个问题对你来说太简单啦,所以小 Z 又改了主意,他现在想
知道,如果他可以在所有骨牌的严格右边任意位置放置一个任意大小的骨牌, 最
少有多少个骨牌会被破坏?
[输入格式]
从 card.in 中读取数据。
第一行读入一个数字 n,表示小 Z 已经摆放的骨牌数量。
接下来 n 行,每行读入两个正数 xi,yi,表示一个骨牌的信息。
[输出格式]
输出一个数字,表示最少有多少个骨牌被破坏。
[样例输入]
4
1 9
3 1
6 1
7 4
[样例输出]
1
[样例解释]
假如在位置 666 摆放一个大小 659 的骨牌,将会只有一个骨牌被破坏。
[数据范围与约定]
对于 20%的数据 保证存在一个最优方案在坐标[1,100]内摆放骨牌
对于 40%的数据 n<=5000
对于 100%的数据 n<=100000,1<=xi,yi<=10^9

二分每一块骨牌倒下后左端的位置,然后从倒下的位置转移到当前位置。

#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int f[100001];
int x[100001],y[100001],num[100001],c[100001];
bool cmp(int p,int q){
    return x[p]<x[q];
}
int ans;
int main(){
    //freopen("card.in","r",stdin);
    //freopen("card.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&x[i],&y[i]);num[i]=i;
    }
    sort(num+1,num+n+1,cmp);
    for(int i=1;i<=n;i++) c[i]=x[num[i]];
    for(int i=2;i<=n;i++){
        int loc=lower_bound(c+1,c+n+1,x[num[i]]-y[num[i]])-c-1;
        f[i]=f[loc]+i-loc-1;
    }
    int ans=n;
    for(int i=2;i<=n;i++){
        if(f[i]+n-i<ans) ans=f[i]+n-i;
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-08 01:03:27

20170929 校内模拟赛 多米诺骨牌的相关文章

POJ 1135 Domino Effect(最短路 多米诺骨牌)

题意 题目描述: 你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两张骨牌之间只有很短的空隙.如果排列得很好,当你推 倒第 1张骨牌,会使其他骨牌连续地倒下(这就是短语"多米诺效应"的由来). 然而当骨牌数量很少时,这种玩法就没多大意思了,所以一些人在 80 年代早期开创了另一个 极端的多米诺骨牌游戏:用上百万张不同颜色.不同材料的骨牌拼成一幅复杂的图案.他们开创 了一种流行的艺术.在这种骨牌游戏中,通常有多行骨牌同时

洛谷 P1282 多米诺骨牌

题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2.每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置. 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小. 对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0. 输入输出格式 输入格式: 输入文件的第一行是一个正

luogu P1282 多米诺骨牌

题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2.每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置. 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小. 对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0. 输入输出格式 输入格式: 输入文件的第一行是一个正

poj 1717==洛谷P1282 多米诺骨牌

Dominoes Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6571   Accepted: 2178 Description A domino is a flat, thumbsized tile, the face of which is divided into two squares, each left blank or bearing from one to six dots. There is a ro

FZU 2163 多米诺骨牌

Problem Description Vasya很喜欢排多米诺骨牌.他已经厌倦了普通的多米诺骨牌,所以他用不同高度的多米诺骨牌.他从左边到右边,把n个多米诺骨牌沿一个轴放在桌子上.每一个多米诺骨牌垂直于该轴,使该轴穿过其底部的中心.第i个多米诺骨牌具有坐标xi与高度hi.现在Vasya想要知道,对于每一个多米诺骨牌如果他推倒的话,右侧会有多少个多米诺骨牌也会倒下. 想想看,一个多米诺倒下,如果它严格的触动右侧的多米诺骨牌,被触碰的也会倒下.换句话说,如果多米诺骨牌(初始坐标x和高度h)倒下,会

S6 edge+的多米诺骨牌效应:大屏的趋势

日前,为庆祝三星S6 edge+国行版的顺利发售,三星盖乐世社区的一些粉丝自发组织了三星疯狂"盖星人"第一期活动--活动现场除了可以对S6 edge+进行全方面体验之外,还将演示著名的多米诺骨牌游戏.作为一个对手机产品有着持续关注和体验热情的"用户"来说,这样的活动自然不能错过,于是在通过三星盖乐世社区的规则报名之后,笔者顺利通过审核,之后终于迎来了到现场体验的日期. 这次的疯狂"盖星人"线下活动主要有两个内容环节,分别是三星S6 edge+的产

状态压缩动态规划 -- 多米诺骨牌

用1*2 的骨牌通过组合拼成 m * n 的大矩形,问有几种拼法. 题目链接:http://poj.org/problem?id=2411 状态转移: 1.由于上一行的该列竖直放置骨牌为 0,影响到当前行的该列,当前行的该列为 1 2.当前行骨牌横放,上一行骨牌横放, 都为11 3.上一行该列置为 1,当前行当前列立着放为 0 #include <iostream> #include <cstring> using namespace std; #define MAXSIZE 12

ZOJ 3650(多米诺骨牌 dp + 线段树优化)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3650 题意: 给你n个骨牌,每个骨牌有一个在x轴上的位置和高度,每个骨牌可以想左推也可以向右推,问最少多少步可以把骨牌全部推倒. 思路: 之前Goodbye 2014 上的E题就是一道多米诺骨牌的题目,虽然跟这道题目不太一样但是还是提供了一下思路, 附题解的链接: http://blog.csdn.net/u013649253/article/details/4

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl