Open Credit System uva11078

8 篇文章 0 订阅

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 组数据 , 对于每一组数据,给出 k 个数,寻找最大的一对 ai - aj (i < j)。

思路:因为题干给出的数据量较大,所以用传统暴力并不能解决问题。我们可以简单分析一下,对于一个定点 j 来说当然是希望他前面的数越大那么这个差就越大,所以对于定点 j 来说找到一个前面的最大值与其相减即可。对于整个序列求这样的值,我们只需要把每个位置都要当一下这个定点,也就是在扫描的时候更新答案和遍历过最大的值就好了。

#include<vector>
 #include<iostream>
  #include<cstdio>
using namespace std;
 typedef long long ll;
void solve(int n){ vector<int> a;
  for(int i = 0 ; i < n ; ++ i){int k ;scanf("%d",&k);
     a.push_back(k);
  }
  int ans = a[0] - a[1],maxn = a[0];
  for(int i = 1 ; i < n ; ++ i) ans = max(ans,maxn-a[i]),maxn = max(a[i],maxn);
  printf("%d\n",ans);

}
  int main()
  {
      int t;
        cin >> t;
          while(t--){ int n;
              scanf("%d",&n);solve(n);
          }
  }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值