51nod 1402 最大值 3级算法题 排序后修改限制点 时间复杂度O(m^2)
代码:
题意,第一个数为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)的更多相关文章
- 51nod图论题解(4级,5级算法题)
51nod图论题解(4级,5级算法题) 1805 小树 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 她发现她的树的点上都有一个标号(从1到n),这些树都在空 ...
- Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
1523 非回文 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个字符串是非回文的,当且仅当,他只由前p个小写字母 ...
- 51nod——1402最大值、2479小b分糖果 (套路)
1402最大值:正向从1到n,如果没有限制,就依次递增1,如果有限制,就取那个限制和递增到这的最小值.这样保证1和每个限制点后面都是符合题意的递增,但是限制点前面这个位置可能会有落差(之前递增多了). ...
- 51nod 1402 最大值(贪心)
原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1402 思路:借鉴了这篇博文http://blog.csdn.n ...
- 51nod 1785 数据流中的算法 (方差计算公式)
1785 数据流中的算法 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间.鼠 ...
- 51 Nod 1402 最大值
1402 最大值 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 一个N长的数组s[](注意这里的数组初始下标设为1 ...
- 51nod 1095 Anigram单词【hash/map/排序/字典树】
1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b ...
- 51nod 1785 数据流中的算法 | STL的应用
51nod 1785 数据流中的算法 题面 动态求平均数.方差.中位数. 题解 这道题的坑: 平均数在答案中是向下取整输出并在后面添加".00" 方差:平方的平均数减去平均数的平方 ...
- 51nod 矩阵快速幂(模板题)
1113 矩阵快速幂 基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大 ...
随机推荐
- Python笔记(八)
#-*-coding:utf-8-*- # Python内置函数 print abs(-45) # 绝对值函数 print divmod(7,2) # 返回一个包含商和余数的元组 # input(&q ...
- Java入门第一季
慕课网:http://www.imooc.com/learn/85 Java入门知识第一季 1.Java开发环境和IDE的使用: 2.变量和常量 3.常用的运算符 4.流程控制语句 5.数组:使用Ar ...
- java代码实现python2中aes加密经历
背景: 因项目需要,需要将一个python2编写的aes加密方式改为java实现. 1.源python2实现 from Crypto.Cipher import AES from binascii i ...
- javascript在html直接传值
function getUrlParam(url, name) { var pattern = new RegExp("[?&]" + name + "\=([^ ...
- Xcode7 下导入第三方库 图文介绍
网上没有很好的图文介绍,干脆我自己写一个好了,方便新手入门. 这里以导入著名的第三方网络库AFNetWorking v3.0.4和数据库FMDB v2.6.2为例进行说明. 好,下面开始. 下载源文件 ...
- CSS——背景图像区域
background-clip属性 background-clip属性指定背景绘制区域 语法 background-clip:border-box|padding-box|content-box; b ...
- 基础——(5)D Flip-Flop(D触发器)
之前搞了一个 D-Latch,看一下下图是怎么变化的 In D-latch anytime its enabled the input D is going to be output at Q 使用c ...
- rsync实时同步mysql数据库
1.主机slave 注:没有包的可以去下载 yum -y install gcc gcc-c++ 上传包 rsync-3.1.3.tar.gz 使用tar命令解压 使用gcc gcc-c++编译 ./ ...
- Java获取当天、本周、本月、本季度、本年等 开始及结束时间
package com.zhaochao.utils; import java.text.SimpleDateFormat; import java.util.Calendar; import jav ...
- python_传递任意数量的实参
'''def name(*args): #python创建一个空元组,将收到的所有值都封装在这个元组中 """打印所有姓名""" for i ...