代码:

题意,第一个数为0,相邻的数相差0或者1,有一些点有限制,不大于给定值,求这组数中可能的最大的那个数。

这题我们看一个例子:第5个数的限制为2

1 2 3 4 5 6 7 8 9

0 1 2 3 2

第一个数一定是0,那么我们可以看出其中最大的数为3。

第二个例子:第6个数的限制为2

1 2 3 4 5 6 7 8 9

0 1 2 3 3 2

其中最大的数为3。

关于奇数和偶数,我们可以总结出一个规律

假设左边的数的下标为left,右边的数的下标为right,左边的数为value1,右边的数为value2。

我们可以得出其中的最大值mx = (right-left-(value2-value1))/2+value2。

如果还是不清楚,可以画一画图,这是化简得来的。

有了这个公式我们就好办了,每个限制点分类讨论,1.能达到限制值,2.不能达到限制值。

最后要注意的一点是:这题有个坑

可能后面的限制点会约束前面的限制点。

例如:

第3个点限制为2,第4个点限制为0

如果只管前面的点,不顾后面的点的话,

1 2 3 4 5

0 1 2 0

这样会产生矛盾,导致第3个点与第4个点差值大于1。

所以我们需要先把限制条件处理好,

我们把所有限制点,对其他点的约束,处理好之后,再按照最前面的公式,和分类讨论来做就可以AC了。

我处理限制点的方法是:考虑到只有限制值小的点会对限制值大的产生影响,

            我对这些数排个序,把每个点对,比它大的点的约束修改好之后,再来算就好了。

可能会考虑到的问题是:一个点A对后面的某个点B约束修改之后,可能不再是顺序的。

            这不是问题,因为B是被A修改来的,它不会对左边的数产生影响。

           反证法:如果能产生影响的话,说明A没有修改完所有可以改变的点,产生矛盾,所以不会对前面的点产生影响。

代码:

#include <bits\stdc++.h>
using namespace std;
typedef long long ll; //用来排序的数组
struct node{
int index;
int value;
int con; //存在原数组s1中的位置
}s[]; int s1[][]; // 原数组,输入数据 bool cmp(node x,node y){
if(x.value == y.value) return x.index < y.index;
else return x.value < y.value;
} int main() {
int t,n,m;
cin >> t;
while(t--){
cin >> n >> m;
for(int i = ;i < m; i++){
cin >> s1[i][] >> s1[i][];
s[i].index = s1[i][];
s[i].value = s1[i][];
s[i].con = i;
}
sort(s,s+m,cmp);
for(int i = ;i < m; i++){
for(int j = i+;j < m; j++){
if(s[i].value < s[j].value){
if(abs(s[j].index-s[i].index)+s[i].value < s[j].value){
s[j].value = abs(s[j].index-s[i].index)+s[i].value;
s1[s[j].con][] = abs(s[j].index-s[i].index)+s[i].value;
}
}
}
} int k1,k2;
int value = ;int index = ;
int ans = ;
s1[m][] = n,s1[m][] = ;
for(int i = ;i <= m; i++){
k1 = s1[i][];k2 = s1[i][];
int mx = k1-index+value;
if(mx <= k2){
value = mx;
index = k1;
ans = max(ans,mx);
}else{
int l = k1-index+-(k2-value)-;
ans = max(ans,(l+)/+k2);
value = k2;
index = k1;
}
}
cout << ans << endl;
}
return ;
}
// writen by zhangjiuding

51nod 1402 最大值 3级算法题 排序后修改限制点 时间复杂度O(m^2)的更多相关文章

  1. 51nod图论题解(4级,5级算法题)

    51nod图论题解(4级,5级算法题) 1805 小树 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 她发现她的树的点上都有一个标号(从1到n),这些树都在空 ...

  2. Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]

    1523 非回文 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个字符串是非回文的,当且仅当,他只由前p个小写字母 ...

  3. 51nod——1402最大值、2479小b分糖果 (套路)

    1402最大值:正向从1到n,如果没有限制,就依次递增1,如果有限制,就取那个限制和递增到这的最小值.这样保证1和每个限制点后面都是符合题意的递增,但是限制点前面这个位置可能会有落差(之前递增多了). ...

  4. 51nod 1402 最大值(贪心)

    原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1402 思路:借鉴了这篇博文http://blog.csdn.n ...

  5. 51nod 1785 数据流中的算法 (方差计算公式)

    1785 数据流中的算法 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题   51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间.鼠 ...

  6. 51 Nod 1402 最大值

    1402 最大值  题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 一个N长的数组s[](注意这里的数组初始下标设为1 ...

  7. 51nod 1095 Anigram单词【hash/map/排序/字典树】

    1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b ...

  8. 51nod 1785 数据流中的算法 | STL的应用

    51nod 1785 数据流中的算法 题面 动态求平均数.方差.中位数. 题解 这道题的坑: 平均数在答案中是向下取整输出并在后面添加".00" 方差:平方的平均数减去平均数的平方 ...

  9. 51nod 矩阵快速幂(模板题)

    1113 矩阵快速幂  基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大 ...

随机推荐

  1. Linux 系列- 基本命令

    Linux 基本命令 转自:http://www.taobaotest.com/blogs/qa?bid=353 Linux是一个基于命令的系统,它有很多很强的命令. 但它也有桌面系统,比如KDE, ...

  2. PHPMailer使用说明

    PHPMailer是一个用来发送电子邮件的函数包,远比PHP提供的mail()方便易用. 邮件格式说明 一封普通的电子邮件,通常是由发件人.收件人.抄送人.邮件标题.邮件内容.附件等内容构成.以下是一 ...

  3. php.ini配置文件参数优化

    用于生产环境中的PHP需要对其进行优化,让PHP自身发挥更好的性能,除了写好PHP代码,还要配置好php-fpm以及php.ini调优.本文从内存.OPcache.上传.会话以及安全等方面讲解php. ...

  4. (转)Django学习之 第一章:Django介绍

    Django: Python编程Web框架 如果你上djangoproject.com你会发现对Django的如下解释: “Django is a high-level Python Web fram ...

  5. jsp指令和学习笔记集锦

    Jsp包含三个编译指令和七个动作指令.三个编译指令为:page.include.taglib. 七个动作指令为:jsp:forward.jsp:param.jsp:include.jsp:plugin ...

  6. MySQL构造测试数据

    构造测试数据(笛卡尔积,6 次100 万) create table t1(id int, val varchar(80)); set @i := 0;create table tmp as sele ...

  7. ZBrush中物体的显示与隐藏

    在ZBrush®中除了遮罩功能可以对局部网格进行编辑外,通过显示和隐藏局部网格也可以对局部进行控制.选择网格的控制都是手动操作,在软件中并没有相应的命令进行操作.选择局部网格的工作原理也很简单,即被选 ...

  8. day19-1 迭代器,三元表达式,列表推导式,字典生成式,

    目录 迭代器 可迭代对象 迭代器对象 总结 三元表达式(三目表达式) 列表推导式 字典生成式 迭代器 可迭代对象 拥有iter方法的对象就是可迭代对象 # 以下都是可迭代的对象 st = '123'. ...

  9. CentOS7上安装google谷歌浏览器

      1.首先进入根目录,然后进入etc/yum.repos.d目录下,创建google-chrome.repo文件 cd / cd etc/yum.repos.d vim google-chrome. ...

  10. Python多环境扩展管理

    Python发展至今,版本众多,在使用过程中经常遇到第三方库依赖的Python版本和系统Python版本不一致的情况.同时又因系统底层需调用当前版本Python,所以不能随意变更当前系统Python版 ...