代码:

题意,第一个数为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. CaffeExample 在CIFAR-10数据集上训练与测试

    本文主要来自Caffe作者Yangqing Jia网站给出的examples. @article{jia2014caffe, Author = {Jia, Yangqing and Shelhamer ...

  2. CentOS 5/6 下添加epel源

    如果既想获得 RHEL 的高质量.高性能.高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages for Enter ...

  3. submile 安装,汉化,插件

    /*删除以前配置文件*/ 删除以前版本sublime后,在删除以前版本的配置信息:直接在C盘 查询里面输入 Roming  然后查找里面的 sublime 文件夹,把他给删除掉 ----------- ...

  4. Unity 围绕X、Y、Z旋转图例

    绿色:绕X 红色:绕Y 蓝色:绕Z PS:这是右手坐标系,Unity为左手坐标系 不知道啥叫左手右手?参见我的另一篇文章http://www.cnblogs.com/36bian/p/7571727. ...

  5. 常用的GNOME Shell 扩展

    GNOME Shell(即GNOME 3)桌面环境最初进军Linux世界时,众多批评人士指出其灵活性有所欠缺.当初外观有所突破的GNOME确实会给生产效率带来一些影响,然而它多年来一直默默通过多种方式 ...

  6. Java通过UUID随机生成36位、32位唯一识别码(唯一字符串)

    import java.util.UUID; /** * 通过UUID随机生成36位.32位唯一识别码(唯一字符串) * @author [J.H] * */ public class Test { ...

  7. node——文件写入,文件读取

    ru //实行文件操作 //文件写入 //1.加载文件操作,fs模块 var fs = require('fs'); //2.实现文件写入操作 var msg='Hello world'; //调用f ...

  8. socket&socketserver网络编程

    1.套接字与套接模块 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了 ...

  9. Element源码阅读(2)

    一.element中的指令 在input-number组件中, 用到一个v-repeat-click指令, 主要用于input-number组件的重复点击效果.具体实现在directives中的rep ...

  10. 八、frps服务端与nginx可共用80端口

    我的服务器,已经用nginx 做网站了,80端口只有一个,我还想我的frps一起使用,可以吗?这个是可以实现的,利用nginx的反向代理实现. 以下是在frps服务器上安装的nginx配置文件中设置的 ...