M 扫描法

In an open credit system, the students can choose any course they like, but there is a problem. Some of the students are more senior than other students. The professor of such a course has found quite a number of such students who came from senior classes (as if they came to attend the pre requisite course after passing an advanced course). But he wants to do justice to the new students. So, he is going to take a placement test (basically an IQ test) to assess the level of difference among the students. He wants to know the maximum amount of score that a senior student gets more than any junior student.

For example, if a senior student gets 80 and a junior student gets 70, then this amount is 10. Be careful that we don’t want the absolute value. Help the professor to figure out a solution. Input Input consists of a number of test cases T (less than 20).

Each case starts with an integer n which is the number of students in the course. This value can be as large as 100,000 and as low as 2. Next n lines contain n integers where the i’th integer is the score of the i’th student. All these integers have absolute values less than 150000. If i < j, then i’th student is senior to the j’th student.

Output

For each test case, output the desired number in a new line. Follow the format shown in

sample

input-output section.

Sample Input

3

2

100

20

4

4

3

2

1

4

1

2

3

4

Sample Output

80

3

-1

解题思路:

这个题目的意思是n个数组成一个序列,求两数最大的差,PS:这个序列不能改变原数的位置,即要从前面第一个数开始与后面每一个数作差,但是是这样时间可能会超时,所以我们每找一个数,与之前的最大数作差后,再与之前最大差相比,存下最大差;然后再与它之前的那个最大数相比,存下最大数,循环下去,只要循环n-1次即可。

程序代码:

#include <cstdio>
using namespace std;
int max(int a,int b)
{
    return a>b?a:b;
}
int a[200005];
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%d",&n);
       for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
       int ans=-1;
       int f=a[0];
       for(int i=1;i<n;i++)
       {
        ans=max(ans,f-a[i]);
        f=max(f,a[i]);
       }
       printf("%d\n",ans);
    }
    return 0;
}

时间: 2025-01-01 10:56:34

M 扫描法的相关文章

UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)

任意线可以贪心移动到两点上.直接枚举O(n^3),会TLE. 所以采取扫描法,选基准点,然后根据极角或者两两做叉积比较进行排排序,然后扫一遍就好了.旋转的时候在O(1)时间推出下一种情况,总复杂度为O(n^2logN)就可以过了. 另外,本题有个很巧妙的技巧,就是一点等效与相反坐标的相反颜色的点. 第一次写,细节还是蛮多的,花了好久才搞清所有细节... 极角排序版,比较容易理解,932ms. #include<bits/stdc++.h> using namespace std; const

poj1113Wall 求凸包周长 Graham扫描法

#include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef pair<int ,int > ll; ll num,dot[1010]; int i; const double pi=3.1415926535898; ll operator -(ll a,ll b) { return make_pair(a.first-b.first,a.second-

hdu--1866--矩形重叠&lt;扫描法,自定义&gt;

擦  终于做出题了...........  这2天 没心思啊  烦 烦 ... 这题 虽然不难 但还是有地方要注意 可能会有空格存在 所以不能用cin scanf去读 一定要用getline  gets来读取 而且 可能会有除了题目中这些 ( ) , +这4个符号以为的字符 所以判断的时候 用!(ch>='0' && ch<='9')来判断 因为 数据很小的啊 才1000  整个扫过去就是了 用个标记变量数组vis表示 是否被扫过了 然后一块格子一块格子++来计算总面积 ...

计算几何 : 凸包学习笔记 --- Graham 扫描法

凸包 (只针对二维平面内的凸包) 一.定义 简单的说,在一个二维平面内有n个点的集合S,现在要你选择一个点集C,C中的点构成一个凸多边形G,使得S集合的所有点要么在G内,要么在G上,并且保证这个凸多边形的面积最小,我们要求的就是这个C集合. 二.算法 求凸包的算法很多,常用的有两种: 1.  Graham扫描法,运行时间为O(nlgn). 2.  Jarvis步进法,运行时间为O(nh),h为凸包中的顶点数. 这里主要讨论第一种算法:Graham扫描法 Graham扫描法: 基本思想:使用一个栈

凸包-Graham扫描法

RT,Graham扫描法求凸包分为3步: 1.找到y最小的点 2.以y最小的点O为原点,求其余所有点相对O的极角并按极角从小到大排序 3.对于排序后的点集,配合栈,完成Graham扫描. ConvexHull.py #coding=utf-8 import math import numpy import pylab as pl #画原始图 def drawGraph(x,y): pl.title("The Convex Hull") pl.xlabel("x axis&qu

【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of

快速排序之单项扫描法

快速排序是排序算法中最受青睐的算法之一,相对于堆排序和归并排序而言,即便具有相同的复杂度O(NlogN).面对大数据而言,快排的效率也更高.一般而言,数据结构中的排序算法都是采取的双向指针法.在之前写的一篇博文<排序算法(初级版)之快排.归并.堆排序>中已经有过总结.这里就不再啰嗦了. 本篇博文主要讲一下,快拍的单项扫描实现,可以实现对链表的快拍.同时,本算法可以高效的解决<剑指offer>中的“寻找最小k个数” 以下内容主要摘自<算法导论>: 本算法将待排序数组arr

UVA - 1606 Amphiphilic Carbon Molecules 极角扫描法

题目:点击查看题目 思路:这道题的解决思路是极角扫描法.极角扫描法的思想主要是先选择一个点作为基准点,然后求出各点对于该点的相对坐标,同时求出该坐标系下的极角,按照极角对点进行排序.然后选取点与基准点形成的线对点进行扫描,基准线为遍历选取,扫描线扫过的点,减去基准线扫过的点即为所要求的点的数量.同时注意到我们要求的是线两边的两种点的数量,于是一种点比如黑点可以旋转180度,然后之考察这180度内的百点数量即可.本题的基准点选取复杂度为O(n),极角排序复杂度O(nlogn),扫描复杂度O(n),

[hdu contest 2019-07-29] Azshara&#39;s deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法

今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相交但是可以有公共端点. 首先找出凸包,然后把n*n条边和m个圆算点到直线距离验证一下边是否与圆相交存到e[n][n]里. 然后显然是一个dp,但是我开始看错题目了以为不能有公共端点,能有公共端点的情况考虑一下像一个找三角形的过程,就是区间dp. 区间dp有一点妙的地方是最大区间范围是凸包点数而不用+1,因为连

10.1 叉积 ,极角排序,扫描法求凸包

凸包:用一个凸多边形将所有点围起来,这个凸多边形就是凸包 1.先要引入一个数学工具,向量叉积   |c|=|a×b|=|a| |b|sinα   (α为a,b向量之间的夹角) 则 |c| 为向量a ,b所组成的平行四边形的面积 这里是用叉积判断两向量的相对位置关系(非常有用!) 则 a x b < 0 (a在b的逆时针方向 ) , b x a > 0(b在a的顺时针方向) //求叉积 struct node{ double x ,y; node operator -( const node &